@byuhbll/components 4.0.0-alpha.9 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/esm2022/lib/animations/animations.mjs +5 -5
  2. package/esm2022/lib/checkbox/checkbox.component.mjs +15 -0
  3. package/esm2022/lib/contact-utils.mjs +41 -0
  4. package/esm2022/lib/copy-tooltip/copy-tooltip.component.mjs +3 -3
  5. package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +3 -3
  6. package/esm2022/lib/hbll-footer/hbll-footer.component.mjs +98 -0
  7. package/esm2022/lib/hbll-header/hbll-header.component.mjs +30 -25
  8. package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +252 -218
  9. package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +3 -3
  10. package/esm2022/lib/header-with-impersonation/header-with-impersonation.component.mjs +39 -0
  11. package/esm2022/lib/impersonate-modal/impersonate-modal.component.mjs +190 -0
  12. package/esm2022/lib/impersonation-banner/impersonation-banner.component.mjs +149 -0
  13. package/esm2022/lib/impersonation-banner/models/application-access.mjs +7 -0
  14. package/esm2022/lib/impersonation-banner/models/person-summary.mjs +15 -0
  15. package/esm2022/lib/models/token-payload.mjs +2 -0
  16. package/esm2022/lib/multi-select/multi-select.component.mjs +115 -0
  17. package/esm2022/lib/pipes/hbll-item-type-icon.pipe.mjs +128 -0
  18. package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +5 -5
  19. package/esm2022/lib/ss-search-bar/date-range/date-range.component.mjs +3 -3
  20. package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +3 -3
  21. package/esm2022/lib/utils.mjs +2 -3
  22. package/esm2022/public-api.mjs +7 -2
  23. package/fesm2022/byuhbll-components.mjs +809 -457
  24. package/fesm2022/byuhbll-components.mjs.map +1 -1
  25. package/lib/{hbll-checkbox/hbll-checkbox.component.d.ts → checkbox/checkbox.component.d.ts} +1 -1
  26. package/lib/contact-utils.d.ts +19 -0
  27. package/lib/hbll-footer/hbll-footer.component.d.ts +30 -0
  28. package/lib/hbll-header/hbll-header.component.d.ts +12 -16
  29. package/lib/hbll-header/nav-bar/nav-bar.component.d.ts +5 -3
  30. package/lib/header-with-impersonation/header-with-impersonation.component.d.ts +20 -0
  31. package/lib/{hbll-header/impersonate-modal → impersonate-modal}/impersonate-modal.component.d.ts +3 -1
  32. package/lib/impersonation-banner/impersonation-banner.component.d.ts +52 -0
  33. package/lib/{hbll-multi-select/hbll-multi-select.component.d.ts → multi-select/multi-select.component.d.ts} +1 -1
  34. package/lib/pipes/hbll-item-type-icon.pipe.d.ts +17 -0
  35. package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +4 -1
  36. package/package.json +1 -1
  37. package/public-api.d.ts +6 -1
  38. package/styles/scss/_mixins.scss +1 -1
  39. package/styles/scss/_vars.scss +1 -0
  40. package/styles/scss/base.scss +1 -2
  41. package/styles/scss/shared.scss +8 -0
  42. package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +0 -15
  43. package/esm2022/lib/hbll-header/impersonate-modal/impersonate-modal.component.mjs +0 -188
  44. package/esm2022/lib/hbll-header/models/application-access.mjs +0 -7
  45. package/esm2022/lib/hbll-header/models/person-summary.mjs +0 -15
  46. package/esm2022/lib/hbll-header/models/token-payload.mjs +0 -2
  47. package/esm2022/lib/hbll-impersonation-banner/hbll-impersonation-banner.component.mjs +0 -129
  48. package/esm2022/lib/hbll-multi-select/hbll-multi-select.component.mjs +0 -115
  49. package/lib/hbll-impersonation-banner/hbll-impersonation-banner.component.d.ts +0 -30
  50. /package/lib/{hbll-header → impersonation-banner}/models/application-access.d.ts +0 -0
  51. /package/lib/{hbll-header → impersonation-banner}/models/person-summary.d.ts +0 -0
  52. /package/lib/{hbll-header/models → models}/token-payload.d.ts +0 -0
@@ -1,188 +0,0 @@
1
- import { Component, ElementRef, EventEmitter, HostListener, Input, Output, Pipe, inject, input, } from '@angular/core';
2
- import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
3
- import { Subject, Subscription, of } from 'rxjs';
4
- import { catchError, startWith, switchMap, tap } from 'rxjs/operators';
5
- import { libHbllFadeInOut } from '../../animations/animations';
6
- import urlcat from 'urlcat';
7
- import { HttpClient } from '@angular/common/http';
8
- import { CommonModule } from '@angular/common';
9
- import { toSignal } from '@angular/core/rxjs-interop';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/forms";
12
- export class ImpersonateUserPipe {
13
- transform(user) {
14
- return `${user.name} (${user.netId || 'Unknown'})${user.restricted ? ' — Restricted' : ''}`;
15
- }
16
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ImpersonateUserPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
17
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: ImpersonateUserPipe, isStandalone: true, name: "impersonateUser" }); }
18
- }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ImpersonateUserPipe, decorators: [{
20
- type: Pipe,
21
- args: [{
22
- name: 'impersonateUser',
23
- standalone: true,
24
- }]
25
- }] });
26
- const SEARCH_USERS_PATH = '/impersonate/api/search/';
27
- const START_IMPERSONATE_PATH = '/impersonate/:username';
28
- export class ImpersonateModalComponent {
29
- constructor() {
30
- this.http = inject(HttpClient);
31
- this.fb = inject(FormBuilder);
32
- this.eref = inject(ElementRef);
33
- this.oidcBaseUri = input.required();
34
- this.oidcDefaultIdp = input.required();
35
- // Require an object here so that access tokens are not visible/extractable from the DOM in consuming applications. Instead they are only stored in memory.
36
- this.accessTokenPayload = input.required();
37
- this.dismiss = new EventEmitter();
38
- this.init = new EventEmitter();
39
- this.isOpen = false;
40
- this.hasError = false;
41
- this.form = this.fb.nonNullable.group({
42
- search: this.fb.control('', { validators: Validators.minLength(3) }),
43
- });
44
- this.loading = false;
45
- this.handleSearchSubject = new Subject();
46
- this.results = toSignal(this.form.controls.search.valueChanges.pipe(switchMap((search) => this.handleSearchSubject.pipe(startWith(false), switchMap((handleSearch) => {
47
- this.selectedUsername = undefined;
48
- this.hasError = false;
49
- if (!search || !handleSearch) {
50
- return of(null);
51
- }
52
- this.loading = true;
53
- const results = this.searchUsers(search);
54
- return results.pipe(catchError((e) => {
55
- this.hasError = true;
56
- console.error(e);
57
- return of(null);
58
- }));
59
- }))), tap(() => {
60
- this.loading = false;
61
- })));
62
- this.subs = new Subscription();
63
- this.handleKeyDown = (event) => {
64
- switch (event.key) {
65
- case 'Esc':
66
- case 'Escape': {
67
- this.close();
68
- break;
69
- }
70
- case 'I':
71
- case 'i': {
72
- if (event.ctrlKey || event.metaKey) {
73
- if (this.isOpen) {
74
- this.close();
75
- }
76
- else {
77
- this.init.emit();
78
- }
79
- event.preventDefault();
80
- }
81
- break;
82
- }
83
- default:
84
- break;
85
- }
86
- };
87
- /** Redirect to Keycloak impersonate page, which will redirect back
88
- * after impersonation begins.
89
- */
90
- this.startImpersonation = (username) => {
91
- const _username = username ?? this.selectedUsername;
92
- if (!_username) {
93
- return;
94
- }
95
- const url = urlcat(this.oidcBaseUri(), START_IMPERSONATE_PATH, {
96
- username,
97
- returnUri: window.location.href,
98
- defaultIdp: this.oidcDefaultIdp(),
99
- });
100
- this.replaceUrl(url);
101
- };
102
- this.handleSelectUser = (event) => {
103
- this.selectedUsername = event.target.value;
104
- };
105
- this.clearSearch = () => {
106
- this.form.reset();
107
- };
108
- this.close = () => {
109
- this.dismiss.emit();
110
- this.clearSearch();
111
- };
112
- this.handleFormSubmit = (event) => {
113
- event.preventDefault();
114
- if (this.form.valid) {
115
- this.handleSearchSubject.next(true);
116
- }
117
- };
118
- this.handleSearchKeyPress = (event) => {
119
- if (!['ArrowDown', 'Down'].includes(event.key)) {
120
- return;
121
- }
122
- event.preventDefault();
123
- if (this.results()?.length) {
124
- const firstResult = this.eref.nativeElement.querySelector(`#result_0`);
125
- firstResult?.click();
126
- firstResult?.focus();
127
- }
128
- };
129
- this.handleResultKeyPress = (event) => {
130
- if (['ArrowUp', 'Up'].includes(event.key) &&
131
- event.target?.id === 'result_0') {
132
- event.preventDefault();
133
- this.eref.nativeElement.querySelector('#searchInput')?.focus();
134
- }
135
- else if (event.key === 'Enter') {
136
- event.preventDefault();
137
- this.startImpersonation();
138
- }
139
- };
140
- /** Search Keycloak users using a generic search query. */
141
- this.searchUsers = (query) => {
142
- const uri = urlcat(this.oidcBaseUri(), SEARCH_USERS_PATH, {
143
- query,
144
- });
145
- return this.http.get(uri, {
146
- headers: {
147
- Authorization: `Bearer ${this.accessTokenPayload().token}`,
148
- },
149
- });
150
- };
151
- this.replaceUrl = (url) => window.location.replace(url);
152
- }
153
- set showModal(open) {
154
- this.isOpen = open;
155
- if (open) {
156
- // Set focus on search input shortly after opening modal so user notices
157
- // the input receiving focus.
158
- setTimeout(() => this.eref.nativeElement.querySelector('#searchInput')?.focus(), 250);
159
- }
160
- }
161
- outsideClick(event) {
162
- if (event.target?.id === 'modalBackdrop') {
163
- this.close();
164
- }
165
- }
166
- ngOnDestroy() {
167
- this.subs.unsubscribe();
168
- }
169
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ImpersonateModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
170
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: ImpersonateModalComponent, isStandalone: true, selector: "lib-impersonate-modal", inputs: { showModal: { classPropertyName: "showModal", publicName: "showModal", isSignal: false, isRequired: false, transformFunction: null }, oidcBaseUri: { classPropertyName: "oidcBaseUri", publicName: "oidcBaseUri", isSignal: true, isRequired: true, transformFunction: null }, oidcDefaultIdp: { classPropertyName: "oidcDefaultIdp", publicName: "oidcDefaultIdp", isSignal: true, isRequired: true, transformFunction: null }, accessTokenPayload: { classPropertyName: "accessTokenPayload", publicName: "accessTokenPayload", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { dismiss: "dismiss", init: "init" }, host: { listeners: { "document:mousedown": "outsideClick($event)", "document:keydown": "handleKeyDown($event)" } }, ngImport: i0, template: "@if (isOpen) {\n <div @libHbllFadeInOut class=\"modal-wrapper\" id=\"modalBackdrop\" data-testid=\"backdrop\">\n <div class=\"modal-container\" data-testid=\"modal\">\n <div class=\"modal-header\">\n <h2>Impersonate</h2>\n <button type=\"button\" (click)=\"close()\" aria-label=\"Close\" data-testid=\"close\">\n <span class=\"material-symbols-outlined icon-close\"> close </span>\n </button>\n </div>\n <form [formGroup]=\"form\" (submit)=\"handleFormSubmit($event)\" data-testid=\"searchForm\">\n <div class=\"search-header\">\n <div class=\"secondary\" [class.disabled]=\"!form.valid\">\n <span class=\"keyboard-key\">Enter</span> to search\n </div>\n </div>\n <label\n for=\"searchInput\"\n class=\"search-wrapper\"\n [class.invalid]=\"form.invalid && form.dirty\"\n >\n <span class=\"material-symbols-outlined icon-search\"> search </span>\n <input\n id=\"searchInput\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"search\"\n placeholder=\"Search patrons...\"\n (keydown)=\"handleSearchKeyPress($event)\"\n #searchBox\n data-testid=\"searchInput\"\n />\n @if (!!searchBox.value && form.valid) {\n <span class=\"material-symbols-outlined icon-checkmark\"> check </span>\n }\n @if (searchBox.value.length) {\n <span\n (click)=\"clearSearch()\"\n @libHbllFadeInOut\n class=\"material-symbols-outlined icon-close\"\n >\n close\n </span>\n }\n </label>\n </form>\n <fieldset\n class=\"search-results-wrapper\"\n id=\"resultsScrollContainer\"\n (change)=\"handleSelectUser($event)\"\n >\n @if (!loading && results()) {\n @for (user of results(); track user.netId; let idx = $index) {\n <div\n class=\"result-field result\"\n [class.focus]=\"user.username === selectedUsername\"\n data-testid=\"result\"\n >\n <label\n [for]=\"'result_' + idx\"\n [class.warning]=\"user.restricted\"\n (mouseover)=\"selectedUsername = user.username\"\n >\n @if (user.restricted) {\n <span class=\"material-symbols-outlined icon\"> warning </span>\n } @else {\n <span class=\"material-symbols-outlined icon\"> person </span>\n }\n &nbsp; &nbsp;\n <span [title]=\"user\" data-testid=\"resultText\">{{\n user | impersonateUser\n }}</span>\n <input\n type=\"radio\"\n [value]=\"user.username\"\n class=\"hidden\"\n [id]=\"'result_' + idx\"\n name=\"resultSelect\"\n (keydown)=\"handleResultKeyPress($event)\"\n />\n </label>\n <button\n class=\"impersonate-button\"\n data-testid=\"impersonateBtn\"\n (click)=\"startImpersonation(user.username)\"\n >\n Impersonate\n </button>\n </div>\n } @empty {\n <div class=\"result-field\">\n No results. Try searching by Net ID or BYU ID.\n </div>\n }\n }\n @if (loading) {\n <div class=\"result-field\">\n <div class=\"lib-spinner\"></div>\n </div>\n }\n @if (hasError) {\n <div class=\"result-field\">Something went wrong. We'll keep trying.</div>\n }\n </fieldset>\n </div>\n </div>\n}\n", styles: [".lib-spinner{border:.3em solid #dfe9f7;border-top:.3em solid #4070b0;border-radius:100%;width:30px;height:30px;animation:loadingSpinnerAnimate 1s ease infinite;position:relative}@keyframes loadingSpinnerAnimate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}h2{font-size:1.2em;font-weight:600;margin:0;color:#404040}.warning{color:#b04940}.modal-wrapper{position:fixed;inset:0;background-color:#0000007f;z-index:6001;display:grid;place-items:center}.modal-container{color:#404040;padding:1.2em 1.4em;width:90%;max-width:30em;border-radius:4px;border:1px solid #b7b7b7;box-shadow:0 3px 6px #002e5d20;background-color:#fff;display:grid;grid-template-columns:1fr;gap:1em}.modal-container .modal-header{display:flex;justify-content:space-between;border-bottom:1px solid #e6e6e6;padding-bottom:.8em}.modal-container .modal-header .icon-close{transition:opacity .15s;color:#707070;opacity:1;cursor:pointer}.modal-container .modal-header .icon-close:hover{opacity:.8}.modal-container .hidden{opacity:0;width:0;height:0}.modal-container .search-header{display:flex;align-items:center;justify-content:flex-end;margin-bottom:.8em}.modal-container .search-header .secondary{color:#70707095}.modal-container .search-header .keyboard-key{padding:.1em .4em;border:1px solid currentColor;border-radius:4px}.modal-container .search-wrapper{display:flex;align-items:center;border-radius:4px;border:solid 1px currentColor;color:#ca7ad1cc;background-color:#e6e6e655;padding:.1em .3em .1em .5em;transition:background-color .15s,color .15s}.modal-container .search-wrapper.invalid{background-color:#b0494022}.modal-container .search-wrapper .icon-search{font-size:1.2em}.modal-container .search-wrapper .icon-checkmark{color:#1dce7b}.modal-container .search-wrapper .icon-close{color:#ca7ad1cc;cursor:pointer}.modal-container .search-wrapper .icon-close:hover{color:#ca7ad1}.modal-container .search-wrapper input[type=text]{background:transparent;border:none;outline:none;width:100%;color:#404040;padding:.5em .4em;font-size:1em}.modal-container .search-wrapper input[type=text]:focus{background-color:transparent}.modal-container .search-results-wrapper{border:none;margin:0;padding:0;max-height:25em;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;display:flex;flex-direction:column;align-items:stretch;min-width:0}.modal-container .search-results-wrapper::-webkit-scrollbar{width:6px}.modal-container .search-results-wrapper::-webkit-scrollbar-track{background:#e6e6e6}.modal-container .search-results-wrapper::-webkit-scrollbar-thumb{background-color:#b3b3b3;border-radius:5px}.modal-container .search-results-wrapper::-webkit-scrollbar-thumb:hover{background-color:#888}.modal-container .search-results-wrapper .result-field{font-style:italic;display:flex;align-items:center;justify-content:space-between;padding:.8em}.modal-container .search-results-wrapper .result-field .lib-spinner{margin:auto;display:grid;place-items:center}.modal-container .search-results-wrapper .result-field.result{font-style:normal;padding:0}.modal-container .search-results-wrapper .result-field.result label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1;padding:.8em;display:flex;align-items:center}.modal-container .search-results-wrapper .result-field.result label .icon{font-size:1.2em;margin-right:.4em}.modal-container .search-results-wrapper .result-field.result .impersonate-button{cursor:pointer;display:none;color:#ca7ad1cc;padding:.1em .6em;border:1px solid currentColor;border-radius:4px;background-color:#fff;flex-shrink:0;margin-block:.6em;margin-right:.8em}.modal-container .search-results-wrapper .result-field.result .impersonate-button:hover{color:#ca7ad1;background-color:#fff8}.modal-container .search-results-wrapper .result-field.result:active,.modal-container .search-results-wrapper .result-field.result.focus{background:#f2f2f2}.modal-container .search-results-wrapper .result-field.result.focus .impersonate-button{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: ImpersonateUserPipe, name: "impersonateUser" }], animations: [libHbllFadeInOut] }); }
171
- }
172
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ImpersonateModalComponent, decorators: [{
173
- type: Component,
174
- args: [{ standalone: true, imports: [CommonModule, ReactiveFormsModule, ImpersonateUserPipe], selector: 'lib-impersonate-modal', animations: [libHbllFadeInOut], template: "@if (isOpen) {\n <div @libHbllFadeInOut class=\"modal-wrapper\" id=\"modalBackdrop\" data-testid=\"backdrop\">\n <div class=\"modal-container\" data-testid=\"modal\">\n <div class=\"modal-header\">\n <h2>Impersonate</h2>\n <button type=\"button\" (click)=\"close()\" aria-label=\"Close\" data-testid=\"close\">\n <span class=\"material-symbols-outlined icon-close\"> close </span>\n </button>\n </div>\n <form [formGroup]=\"form\" (submit)=\"handleFormSubmit($event)\" data-testid=\"searchForm\">\n <div class=\"search-header\">\n <div class=\"secondary\" [class.disabled]=\"!form.valid\">\n <span class=\"keyboard-key\">Enter</span> to search\n </div>\n </div>\n <label\n for=\"searchInput\"\n class=\"search-wrapper\"\n [class.invalid]=\"form.invalid && form.dirty\"\n >\n <span class=\"material-symbols-outlined icon-search\"> search </span>\n <input\n id=\"searchInput\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"search\"\n placeholder=\"Search patrons...\"\n (keydown)=\"handleSearchKeyPress($event)\"\n #searchBox\n data-testid=\"searchInput\"\n />\n @if (!!searchBox.value && form.valid) {\n <span class=\"material-symbols-outlined icon-checkmark\"> check </span>\n }\n @if (searchBox.value.length) {\n <span\n (click)=\"clearSearch()\"\n @libHbllFadeInOut\n class=\"material-symbols-outlined icon-close\"\n >\n close\n </span>\n }\n </label>\n </form>\n <fieldset\n class=\"search-results-wrapper\"\n id=\"resultsScrollContainer\"\n (change)=\"handleSelectUser($event)\"\n >\n @if (!loading && results()) {\n @for (user of results(); track user.netId; let idx = $index) {\n <div\n class=\"result-field result\"\n [class.focus]=\"user.username === selectedUsername\"\n data-testid=\"result\"\n >\n <label\n [for]=\"'result_' + idx\"\n [class.warning]=\"user.restricted\"\n (mouseover)=\"selectedUsername = user.username\"\n >\n @if (user.restricted) {\n <span class=\"material-symbols-outlined icon\"> warning </span>\n } @else {\n <span class=\"material-symbols-outlined icon\"> person </span>\n }\n &nbsp; &nbsp;\n <span [title]=\"user\" data-testid=\"resultText\">{{\n user | impersonateUser\n }}</span>\n <input\n type=\"radio\"\n [value]=\"user.username\"\n class=\"hidden\"\n [id]=\"'result_' + idx\"\n name=\"resultSelect\"\n (keydown)=\"handleResultKeyPress($event)\"\n />\n </label>\n <button\n class=\"impersonate-button\"\n data-testid=\"impersonateBtn\"\n (click)=\"startImpersonation(user.username)\"\n >\n Impersonate\n </button>\n </div>\n } @empty {\n <div class=\"result-field\">\n No results. Try searching by Net ID or BYU ID.\n </div>\n }\n }\n @if (loading) {\n <div class=\"result-field\">\n <div class=\"lib-spinner\"></div>\n </div>\n }\n @if (hasError) {\n <div class=\"result-field\">Something went wrong. We'll keep trying.</div>\n }\n </fieldset>\n </div>\n </div>\n}\n", styles: [".lib-spinner{border:.3em solid #dfe9f7;border-top:.3em solid #4070b0;border-radius:100%;width:30px;height:30px;animation:loadingSpinnerAnimate 1s ease infinite;position:relative}@keyframes loadingSpinnerAnimate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}h2{font-size:1.2em;font-weight:600;margin:0;color:#404040}.warning{color:#b04940}.modal-wrapper{position:fixed;inset:0;background-color:#0000007f;z-index:6001;display:grid;place-items:center}.modal-container{color:#404040;padding:1.2em 1.4em;width:90%;max-width:30em;border-radius:4px;border:1px solid #b7b7b7;box-shadow:0 3px 6px #002e5d20;background-color:#fff;display:grid;grid-template-columns:1fr;gap:1em}.modal-container .modal-header{display:flex;justify-content:space-between;border-bottom:1px solid #e6e6e6;padding-bottom:.8em}.modal-container .modal-header .icon-close{transition:opacity .15s;color:#707070;opacity:1;cursor:pointer}.modal-container .modal-header .icon-close:hover{opacity:.8}.modal-container .hidden{opacity:0;width:0;height:0}.modal-container .search-header{display:flex;align-items:center;justify-content:flex-end;margin-bottom:.8em}.modal-container .search-header .secondary{color:#70707095}.modal-container .search-header .keyboard-key{padding:.1em .4em;border:1px solid currentColor;border-radius:4px}.modal-container .search-wrapper{display:flex;align-items:center;border-radius:4px;border:solid 1px currentColor;color:#ca7ad1cc;background-color:#e6e6e655;padding:.1em .3em .1em .5em;transition:background-color .15s,color .15s}.modal-container .search-wrapper.invalid{background-color:#b0494022}.modal-container .search-wrapper .icon-search{font-size:1.2em}.modal-container .search-wrapper .icon-checkmark{color:#1dce7b}.modal-container .search-wrapper .icon-close{color:#ca7ad1cc;cursor:pointer}.modal-container .search-wrapper .icon-close:hover{color:#ca7ad1}.modal-container .search-wrapper input[type=text]{background:transparent;border:none;outline:none;width:100%;color:#404040;padding:.5em .4em;font-size:1em}.modal-container .search-wrapper input[type=text]:focus{background-color:transparent}.modal-container .search-results-wrapper{border:none;margin:0;padding:0;max-height:25em;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;display:flex;flex-direction:column;align-items:stretch;min-width:0}.modal-container .search-results-wrapper::-webkit-scrollbar{width:6px}.modal-container .search-results-wrapper::-webkit-scrollbar-track{background:#e6e6e6}.modal-container .search-results-wrapper::-webkit-scrollbar-thumb{background-color:#b3b3b3;border-radius:5px}.modal-container .search-results-wrapper::-webkit-scrollbar-thumb:hover{background-color:#888}.modal-container .search-results-wrapper .result-field{font-style:italic;display:flex;align-items:center;justify-content:space-between;padding:.8em}.modal-container .search-results-wrapper .result-field .lib-spinner{margin:auto;display:grid;place-items:center}.modal-container .search-results-wrapper .result-field.result{font-style:normal;padding:0}.modal-container .search-results-wrapper .result-field.result label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1;padding:.8em;display:flex;align-items:center}.modal-container .search-results-wrapper .result-field.result label .icon{font-size:1.2em;margin-right:.4em}.modal-container .search-results-wrapper .result-field.result .impersonate-button{cursor:pointer;display:none;color:#ca7ad1cc;padding:.1em .6em;border:1px solid currentColor;border-radius:4px;background-color:#fff;flex-shrink:0;margin-block:.6em;margin-right:.8em}.modal-container .search-results-wrapper .result-field.result .impersonate-button:hover{color:#ca7ad1;background-color:#fff8}.modal-container .search-results-wrapper .result-field.result:active,.modal-container .search-results-wrapper .result-field.result.focus{background:#f2f2f2}.modal-container .search-results-wrapper .result-field.result.focus .impersonate-button{display:block}\n"] }]
175
- }], propDecorators: { showModal: [{
176
- type: Input
177
- }], dismiss: [{
178
- type: Output
179
- }], init: [{
180
- type: Output
181
- }], outsideClick: [{
182
- type: HostListener,
183
- args: ['document:mousedown', ['$event']]
184
- }], handleKeyDown: [{
185
- type: HostListener,
186
- args: ['document:keydown', ['$event']]
187
- }] } });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wZXJzb25hdGUtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtaGVhZGVyL2ltcGVyc29uYXRlLW1vZGFsL2ltcGVyc29uYXRlLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWhlYWRlci9pbXBlcnNvbmF0ZS1tb2RhbC9pbXBlcnNvbmF0ZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sSUFBSSxFQUVKLE1BQU0sRUFDTixLQUFLLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBT3RELE1BQU0sT0FBTyxtQkFBbUI7SUFDNUIsU0FBUyxDQUFDLElBQTZCO1FBQ25D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Q0FBQztRQUNuQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1Asd0VBQXdFO1lBQ3hFLDZCQUE2QjtZQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFGLENBQUM7SUFDTCxDQUFDO0lBbUQrQyxZQUFZLENBQUMsS0FBaUI7UUFDMUUsSUFBSyxLQUFLLENBQUMsTUFBc0IsRUFBRSxFQUFFLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBMEJELFdBQVc7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUM7OEdBL0ZRLHlCQUF5QjtrR0FBekIseUJBQXlCLDh6QkN0RHRDLDJnS0EwR0EsNjZIRDFEYyxZQUFZLDhCQUFFLG1CQUFtQix3OEJBckJsQyxtQkFBbUIsMENBeUJoQixDQUFDLGdCQUFnQixDQUFDOzsyRkFFckIseUJBQXlCO2tCQVJyQyxTQUFTO2lDQUNNLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxZQUN2RCx1QkFBdUIsY0FHckIsQ0FBQyxnQkFBZ0IsQ0FBQzs4QkFPakIsU0FBUztzQkFBckIsS0FBSztnQkFZSSxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkE2Q3lDLFlBQVk7c0JBQTNELFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTUEsYUFBYTtzQkFBMUQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3V0cHV0LFxuICAgIFBpcGUsXG4gICAgUGlwZVRyYW5zZm9ybSxcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgbGliSGJsbEZhZGVJbk91dCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvYW5pbWF0aW9ucyc7XG5pbXBvcnQgdXJsY2F0IGZyb20gJ3VybGNhdCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgVG9rZW5QYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL3Rva2VuLXBheWxvYWQnO1xuXG5AUGlwZSh7XG4gICAgbmFtZTogJ2ltcGVyc29uYXRlVXNlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgSW1wZXJzb25hdGVVc2VyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAgIHRyYW5zZm9ybSh1c2VyOiBJbXBlcnNvbmF0ZVNlYXJjaFJlc3VsdCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt1c2VyLm5hbWV9ICgke3VzZXIubmV0SWQgfHwgJ1Vua25vd24nfSkke3VzZXIucmVzdHJpY3RlZCA/ICcg4oCUIFJlc3RyaWN0ZWQnIDogJyd9YDtcbiAgICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEltcGVyc29uYXRlU2VhcmNoUmVzdWx0IHtcbiAgICBuZXRJZDogc3RyaW5nO1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcHJlZmVycmVkTmFtZTogc3RyaW5nO1xuICAgIGdpdmVuTmFtZTogc3RyaW5nO1xuICAgIHN1cm5hbWU6IHN0cmluZztcbiAgICByZXN0cmljdGVkOiBib29sZWFuO1xufVxuXG5jb25zdCBTRUFSQ0hfVVNFUlNfUEFUSCA9ICcvaW1wZXJzb25hdGUvYXBpL3NlYXJjaC8nO1xuY29uc3QgU1RBUlRfSU1QRVJTT05BVEVfUEFUSCA9ICcvaW1wZXJzb25hdGUvOnVzZXJuYW1lJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBJbXBlcnNvbmF0ZVVzZXJQaXBlXSxcbiAgICBzZWxlY3RvcjogJ2xpYi1pbXBlcnNvbmF0ZS1tb2RhbCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ltcGVyc29uYXRlLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbXBlcnNvbmF0ZS1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICAgIGFuaW1hdGlvbnM6IFtsaWJIYmxsRmFkZUluT3V0XSxcbn0pXG5leHBvcnQgY2xhc3MgSW1wZXJzb25hdGVNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIEBJbnB1dCgpIHNldCBzaG93TW9kYWwob3BlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IG9wZW47XG4gICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAvLyBTZXQgZm9jdXMgb24gc2VhcmNoIGlucHV0IHNob3J0bHkgYWZ0ZXIgb3BlbmluZyBtb2RhbCBzbyB1c2VyIG5vdGljZXNcbiAgICAgICAgICAgIC8vIHRoZSBpbnB1dCByZWNlaXZpbmcgZm9jdXMuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWFyY2hJbnB1dCcpPy5mb2N1cygpLCAyNTApO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9pZGNCYXNlVXJpID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuICAgIG9pZGNEZWZhdWx0SWRwID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuICAgIC8vIFJlcXVpcmUgYW4gb2JqZWN0IGhlcmUgc28gdGhhdCBhY2Nlc3MgdG9rZW5zIGFyZSBub3QgdmlzaWJsZS9leHRyYWN0YWJsZSBmcm9tIHRoZSBET00gaW4gY29uc3VtaW5nIGFwcGxpY2F0aW9ucy4gSW5zdGVhZCB0aGV5IGFyZSBvbmx5IHN0b3JlZCBpbiBtZW1vcnkuXG4gICAgYWNjZXNzVG9rZW5QYXlsb2FkID0gaW5wdXQucmVxdWlyZWQ8VG9rZW5QYXlsb2FkPigpO1xuICAgIEBPdXRwdXQoKSBkaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBpbml0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHJvdGVjdGVkIGlzT3BlbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBoYXNFcnJvciA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBmb3JtID0gdGhpcy5mYi5ub25OdWxsYWJsZS5ncm91cCh7XG4gICAgICAgIHNlYXJjaDogdGhpcy5mYi5jb250cm9sKCcnLCB7IHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpIH0pLFxuICAgIH0pO1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZFVzZXJuYW1lPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJvdGVjdGVkIHJlc3VsdHMgPSB0b1NpZ25hbChcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLnNlYXJjaC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoc2VhcmNoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VhcmNoU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgoZmFsc2UpLFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGhhbmRsZVNlYXJjaCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaCB8fCAhaGFuZGxlU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuc2VhcmNoVXNlcnMoc2VhcmNoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vkb3duJywgWyckZXZlbnQnXSkgb3V0c2lkZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uaWQgPT09ICdtb2RhbEJhY2tkcm9wJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pIGhhbmRsZUtleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0VzYyc6XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnSSc6XG4gICAgICAgICAgICBjYXNlICdpJzoge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqIFJlZGlyZWN0IHRvIEtleWNsb2FrIGltcGVyc29uYXRlIHBhZ2UsIHdoaWNoIHdpbGwgcmVkaXJlY3QgYmFja1xuICAgICAqIGFmdGVyIGltcGVyc29uYXRpb24gYmVnaW5zLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGFydEltcGVyc29uYXRpb24gPSAodXNlcm5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgX3VzZXJuYW1lID0gdXNlcm5hbWUgPz8gdGhpcy5zZWxlY3RlZFVzZXJuYW1lO1xuICAgICAgICBpZiAoIV91c2VybmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybCA9IHVybGNhdCh0aGlzLm9pZGNCYXNlVXJpKCksIFNUQVJUX0lNUEVSU09OQVRFX1BBVEgsIHtcbiAgICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgICAgcmV0dXJuVXJpOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgICAgICAgIGRlZmF1bHRJZHA6IHRoaXMub2lkY0RlZmF1bHRJZHAoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVwbGFjZVVybCh1cmwpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2VsZWN0VXNlciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJuYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGNsZWFyU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGNsb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRpc21pc3MuZW1pdCgpO1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBoYW5kbGVGb3JtU3VibWl0ID0gKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlYXJjaFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2VhcmNoS2V5UHJlc3MgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFbJ0Fycm93RG93bicsICdEb3duJ10uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMoKT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IHRoaXMuZXJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYCNyZXN1bHRfMGApO1xuICAgICAgICAgICAgZmlyc3RSZXN1bHQ/LmNsaWNrKCk7XG4gICAgICAgICAgICBmaXJzdFJlc3VsdD8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlUmVzdWx0S2V5UHJlc3MgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgWydBcnJvd1VwJywgJ1VwJ10uaW5jbHVkZXMoZXZlbnQua2V5KSAmJlxuICAgICAgICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8uaWQgPT09ICdyZXN1bHRfMCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5lcmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI3NlYXJjaElucHV0Jyk/LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydEltcGVyc29uYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogU2VhcmNoIEtleWNsb2FrIHVzZXJzIHVzaW5nIGEgZ2VuZXJpYyBzZWFyY2ggcXVlcnkuICovXG4gICAgcHJpdmF0ZSBzZWFyY2hVc2VycyA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHVyaSA9IHVybGNhdCh0aGlzLm9pZGNCYXNlVXJpKCksIFNFQVJDSF9VU0VSU19QQVRILCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SW1wZXJzb25hdGVTZWFyY2hSZXN1bHRbXT4odXJpLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYWNjZXNzVG9rZW5QYXlsb2FkKCkudG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlcGxhY2VVcmwgPSAodXJsOiBzdHJpbmcpID0+IHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVybCk7XG59XG4iLCJAaWYgKGlzT3Blbikge1xuICAgIDxkaXYgQGxpYkhibGxGYWRlSW5PdXQgY2xhc3M9XCJtb2RhbC13cmFwcGVyXCIgaWQ9XCJtb2RhbEJhY2tkcm9wXCIgZGF0YS10ZXN0aWQ9XCJiYWNrZHJvcFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGFpbmVyXCIgZGF0YS10ZXN0aWQ9XCJtb2RhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxoMj5JbXBlcnNvbmF0ZTwvaDI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBkYXRhLXRlc3RpZD1cImNsb3NlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uLWNsb3NlXCI+IGNsb3NlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJoYW5kbGVGb3JtU3VibWl0KCRldmVudClcIiBkYXRhLXRlc3RpZD1cInNlYXJjaEZvcm1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vjb25kYXJ5XCIgW2NsYXNzLmRpc2FibGVkXT1cIiFmb3JtLnZhbGlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImtleWJvYXJkLWtleVwiPkVudGVyPC9zcGFuPiB0byBzZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cInNlYXJjaElucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pbnZhbGlkXT1cImZvcm0uaW52YWxpZCAmJiBmb3JtLmRpcnR5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uLXNlYXJjaFwiPiBzZWFyY2ggPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2VhcmNoSW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBwYXRyb25zLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVNlYXJjaEtleVByZXNzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlYXJjaEJveFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZWFyY2hJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoISFzZWFyY2hCb3gudmFsdWUgJiYgZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb24tY2hlY2ttYXJrXCI+IGNoZWNrIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNlYXJjaEJveC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBsaWJIYmxsRmFkZUluT3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb24tY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPGZpZWxkc2V0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtcmVzdWx0cy13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICBpZD1cInJlc3VsdHNTY3JvbGxDb250YWluZXJcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlU2VsZWN0VXNlcigkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKCFsb2FkaW5nICYmIHJlc3VsdHMoKSkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yICh1c2VyIG9mIHJlc3VsdHMoKTsgdHJhY2sgdXNlci5uZXRJZDsgbGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVzdWx0LWZpZWxkIHJlc3VsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZvY3VzXT1cInVzZXIudXNlcm5hbWUgPT09IHNlbGVjdGVkVXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicmVzdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcl09XCIncmVzdWx0XycgKyBpZHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mud2FybmluZ109XCJ1c2VyLnJlc3RyaWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cInNlbGVjdGVkVXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodXNlci5yZXN0cmljdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvblwiPiB3YXJuaW5nIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvblwiPiBwZXJzb24gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyAmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RpdGxlXT1cInVzZXJcIiBkYXRhLXRlc3RpZD1cInJlc3VsdFRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8IGltcGVyc29uYXRlVXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVzZXIudXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidyZXN1bHRfJyArIGlkeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicmVzdWx0U2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVJlc3VsdEtleVByZXNzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImltcGVyc29uYXRlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaW1wZXJzb25hdGVCdG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RhcnRJbXBlcnNvbmF0aW9uKHVzZXIudXNlcm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcGVyc29uYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlc3VsdHMuIFRyeSBzZWFyY2hpbmcgYnkgTmV0IElEIG9yIEJZVSBJRC5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGliLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdC1maWVsZFwiPlNvbWV0aGluZyB3ZW50IHdyb25nLiBXZSdsbCBrZWVwIHRyeWluZy48L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbn1cbiJdfQ==
@@ -1,7 +0,0 @@
1
- export var AccessStatus;
2
- (function (AccessStatus) {
3
- AccessStatus["OK"] = "ok";
4
- AccessStatus["BLOCKED"] = "blocked";
5
- AccessStatus["NONE"] = "none";
6
- })(AccessStatus || (AccessStatus = {}));
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tYWNjZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtaGVhZGVyL21vZGVscy9hcHBsaWNhdGlvbi1hY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksWUFJWDtBQUpELFdBQVksWUFBWTtJQUNwQix5QkFBUyxDQUFBO0lBQ1QsbUNBQW1CLENBQUE7SUFDbkIsNkJBQWEsQ0FBQTtBQUNqQixDQUFDLEVBSlcsWUFBWSxLQUFaLFlBQVksUUFJdkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBBY2Nlc3NTdGF0dXMge1xuICAgIE9LID0gJ29rJyxcbiAgICBCTE9DS0VEID0gJ2Jsb2NrZWQnLFxuICAgIE5PTkUgPSAnbm9uZScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25BY2Nlc3Mge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgYWNjZXNzOiBBY2Nlc3NTdGF0dXM7XG4gICAgY29kZT86IHN0cmluZztcbiAgICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNSZXNwb25zZSB7XG4gICAgbmV0SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEFwcGxpY2F0aW9uQWNjZXNzPjtcbn1cbiJdfQ==
@@ -1,15 +0,0 @@
1
- export var EmployeePositionType;
2
- (function (EmployeePositionType) {
3
- EmployeePositionType["STD"] = "std";
4
- EmployeePositionType["SNL"] = "snl";
5
- EmployeePositionType["FAC"] = "fac";
6
- EmployeePositionType["STF"] = "stf";
7
- EmployeePositionType["TMP"] = "tmp";
8
- EmployeePositionType["FTC"] = "ftc";
9
- })(EmployeePositionType || (EmployeePositionType = {}));
10
- export var UndergradGraduateStatus;
11
- (function (UndergradGraduateStatus) {
12
- UndergradGraduateStatus["UNDERGRAD"] = "undergrad";
13
- UndergradGraduateStatus["GRADUATE"] = "graduate";
14
- })(UndergradGraduateStatus || (UndergradGraduateStatus = {}));
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uLXN1bW1hcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvaGJsbC1oZWFkZXIvbW9kZWxzL3BlcnNvbi1zdW1tYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLG9CQU9YO0FBUEQsV0FBWSxvQkFBb0I7SUFDNUIsbUNBQVcsQ0FBQTtJQUNYLG1DQUFXLENBQUE7SUFDWCxtQ0FBVyxDQUFBO0lBQ1gsbUNBQVcsQ0FBQTtJQUNYLG1DQUFXLENBQUE7SUFDWCxtQ0FBVyxDQUFBO0FBQ2YsQ0FBQyxFQVBXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFPL0I7QUFFRCxNQUFNLENBQU4sSUFBWSx1QkFHWDtBQUhELFdBQVksdUJBQXVCO0lBQy9CLGtEQUF1QixDQUFBO0lBQ3ZCLGdEQUFxQixDQUFBO0FBQ3pCLENBQUMsRUFIVyx1QkFBdUIsS0FBdkIsdUJBQXVCLFFBR2xDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gRW1wbG95ZWVQb3NpdGlvblR5cGUge1xuICAgIFNURCA9ICdzdGQnLFxuICAgIFNOTCA9ICdzbmwnLFxuICAgIEZBQyA9ICdmYWMnLFxuICAgIFNURiA9ICdzdGYnLFxuICAgIFRNUCA9ICd0bXAnLFxuICAgIEZUQyA9ICdmdGMnLFxufVxuXG5leHBvcnQgZW51bSBVbmRlcmdyYWRHcmFkdWF0ZVN0YXR1cyB7XG4gICAgVU5ERVJHUkFEID0gJ3VuZGVyZ3JhZCcsXG4gICAgR1JBRFVBVEUgPSAnZ3JhZHVhdGUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGVwZW5kZW50U3R1ZHlSZXNwb25zZSB7XG4gICAgbGlicmFyeV9pZDogc3RyaW5nO1xuICAgIGlzX2Vucm9sbGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvblN1bW1hcnkge1xuICAgIGJ5dV9pZD86IHN0cmluZztcbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIGZpcnN0X25hbWU6IHN0cmluZztcbiAgICBpc19hZmZpbGlhdGU6IGJvb2xlYW47XG4gICAgaXNfZW1wbG95ZWU6IGJvb2xlYW47XG4gICAgaXNfcmV0aXJlZD86IGJvb2xlYW47XG4gICAgcHJpbWFyeV9wb3NpdGlvbl90eXBlPzogRW1wbG95ZWVQb3NpdGlvblR5cGU7XG4gICAgcHJpbWFyeV9wb3NpdGlvbl90eXBlX2Rpc3BsYXk/OiBzdHJpbmc7XG4gICAgaXNfc3R1ZGVudDogYm9vbGVhbjtcbiAgICB1bmRlcmdyYWRfZ3JhZHVhdGVfc3RhdHVzPzogVW5kZXJncmFkR3JhZHVhdGVTdGF0dXM7XG4gICAgbGFzdF9uYW1lOiBzdHJpbmc7XG4gICAgbGlicmFyeV9pZDogc3RyaW5nO1xuICAgIHByZWZlcnJlZF9maXJzdF9uYW1lOiBzdHJpbmc7XG4gICAgcmVzdHJpY3RlZDogYm9vbGVhbjtcbiAgICB3b3JrZXJfaWQ/OiBzdHJpbmc7XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcGF5bG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWhlYWRlci9tb2RlbHMvdG9rZW4tcGF5bG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBUb2tlblBheWxvYWQge1xuICAgIHRva2VuOiBzdHJpbmc7XG59XG4iXX0=
@@ -1,129 +0,0 @@
1
- import { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';
2
- import { map, switchMap } from 'rxjs/operators';
3
- import { AccessStatus, } from '../hbll-header/models/application-access';
4
- import { CommonModule } from '@angular/common';
5
- import { jwtDecode } from 'jwt-decode';
6
- import { toObservable, toSignal } from '@angular/core/rxjs-interop';
7
- import { HttpClient } from '@angular/common/http';
8
- import urlcat from 'urlcat';
9
- import { combineLatest, of } from 'rxjs';
10
- import { CopyTooltipComponent } from '../copy-tooltip/copy-tooltip.component';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/common";
13
- const USER_PHOTO_URL = 'https://y.byu.edu/ry/ae/prod/person/cgi/personPhoto.cgi?n=';
14
- const PERSON_SUMMARY_PATH = '/summary/:libraryId/';
15
- const PERSON_BASE_URI = 'https://apps.lib.byu.edu/person/v2/';
16
- const INDEPENDENT_STUDY_RESPONSE_PATH = '/independent-study/:libraryId/';
17
- const PATRON_ACCOUNTS_PATH = '/patron/accounts';
18
- const LIBRARY_API_BASE_URI = 'https://apps.lib.byu.edu/v1';
19
- export class HbllImpersonationBannerComponent {
20
- constructor() {
21
- this.http = inject(HttpClient);
22
- this.accessTokenPayload = input.required();
23
- this.endImpersonation = new EventEmitter();
24
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
- this.parsedToken = computed(() => this.accessTokenPayload().token ? jwtDecode(this.accessTokenPayload().token) : {});
26
- this.isImpersonating = computed(() => !!this.parsedToken()['impersonator']);
27
- this.libraryId = computed(() => this.parsedToken()['library_id']);
28
- this.user = toSignal(combineLatest([toObservable(this.libraryId), toObservable(this.isImpersonating)]).pipe(switchMap(([libraryId, isImpersonating]) => libraryId && isImpersonating
29
- ? this.http.get(urlcat(PERSON_BASE_URI, PERSON_SUMMARY_PATH, {
30
- libraryId,
31
- }), {
32
- headers: {
33
- Authorization: `Bearer ${this.accessTokenPayload().token}`,
34
- },
35
- })
36
- : of(null))));
37
- this.userFullName = computed(() => this.parsedToken()['given_name']
38
- ? `${this.parsedToken()['given_name']} ${this.parsedToken()['family_name']}`
39
- : 'Unknown');
40
- this.isRestricted = computed(() => this.user()?.restricted);
41
- this.userInfoTabs = computed(() => new Map([
42
- ['Net ID', this.parsedToken()['net_id'] ?? ''],
43
- ['BYU ID', this.parsedToken()['byu_id'] ?? ''],
44
- ['Email', this.parsedToken()['email'] ?? ''],
45
- ]));
46
- this.userPhotoUrl = computed(() => this.parsedToken()['net_id'] ? USER_PHOTO_URL + this.parsedToken()['net_id'] : '');
47
- this.activityStatus = computed(() => {
48
- if (this.user()?.is_retired)
49
- return 'retired';
50
- else if (this.user()?.is_employee)
51
- return 'active';
52
- else if (this.user()?.primary_position_type)
53
- return 'inactive';
54
- return null;
55
- });
56
- this.employeeStatusDescription = computed(() => {
57
- if (!this.user()) {
58
- return null;
59
- }
60
- let description = '';
61
- if (this.user().is_retired) {
62
- description = 'Retired';
63
- }
64
- else if (this.user().is_employee) {
65
- description = 'Active';
66
- }
67
- else if (this.user().primary_position_type) {
68
- description = 'Inactive';
69
- }
70
- if (this.user().primary_position_type_display) {
71
- description += ` ${this.user().primary_position_type_display} Employee`;
72
- }
73
- return description ?? null;
74
- });
75
- this.independentStudyStatus = toSignal(combineLatest([toObservable(this.libraryId), toObservable(this.isImpersonating)]).pipe(switchMap(([libraryId, isImpersonating]) => libraryId && isImpersonating
76
- ? this.http
77
- .get(urlcat(PERSON_BASE_URI, INDEPENDENT_STUDY_RESPONSE_PATH, {
78
- libraryId,
79
- }), {
80
- headers: {
81
- Authorization: `Bearer ${this.accessTokenPayload().token}`,
82
- },
83
- })
84
- .pipe(map((response) => response?.is_enrolled))
85
- : of(null))));
86
- this.accountStatuses = toSignal(toObservable(this.isImpersonating).pipe(switchMap((isImpersonating) => {
87
- if (!isImpersonating) {
88
- return of(null);
89
- }
90
- return this.http
91
- .get(urlcat(LIBRARY_API_BASE_URI, PATRON_ACCOUNTS_PATH), {
92
- headers: {
93
- Authorization: `Bearer ${this.accessTokenPayload().token}`,
94
- },
95
- })
96
- .pipe(map((accounts) => {
97
- const accountStatuses = {
98
- ok: [],
99
- blocked: [],
100
- none: [],
101
- };
102
- Object.values(accounts.applications).forEach((app) => {
103
- switch (app.access) {
104
- case AccessStatus.OK:
105
- accountStatuses.ok.push(app);
106
- break;
107
- case AccessStatus.BLOCKED:
108
- accountStatuses.blocked.push(app);
109
- break;
110
- case AccessStatus.NONE:
111
- accountStatuses.none.push(app);
112
- break;
113
- }
114
- });
115
- return accountStatuses;
116
- }));
117
- })));
118
- this.STATUSES = AccessStatus;
119
- }
120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllImpersonationBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllImpersonationBannerComponent, isStandalone: true, selector: "lib-hbll-impersonation-banner", inputs: { accessTokenPayload: { classPropertyName: "accessTokenPayload", publicName: "accessTokenPayload", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { endImpersonation: "endImpersonation" }, ngImport: i0, template: "@if (isImpersonating()) {\n <div class=\"banner-padding\"></div>\n <div class=\"top-banner\">\n <div class=\"banner-group profile-name-container\">\n <div class=\"profile-avatar\">\n <div class=\"profile-image\">\n <img\n [src]=\"userPhotoUrl()\"\n [alt]=\"userFullName()\"\n alt=\"user photo\"\n onerror=\"this.remove()\"\n />\n </div>\n <span class=\"material-symbols-outlined profile-icon\"> person </span>\n </div>\n <div class=\"profile-name-group\">\n <span class=\"soft\">Impersonating</span>\n <div class=\"profile-name-wrapper\">\n <span class=\"profile-name\">{{ userFullName() }}</span>\n @if (accountStatuses()) {\n <div class=\"application-status-bar\">\n @if (accountStatuses()!.ok.length) {\n <div class=\"application-status-indicator\">\n <span class=\"application-status-ok application-status\">\n <span class=\"material-symbols-outlined icon-checkmark\">\n check\n </span>\n <span class=\"application-count\">{{\n accountStatuses()!.ok.length\n }}</span>\n </span>\n <div class=\"status-tooltip-container\">\n <div class=\"status-tooltip\">\n OK Applications\n <hr />\n @for (\n application of accountStatuses()!.ok;\n track application.label\n ) {\n <div class=\"application-status\">\n <span\n class=\"material-symbols-outlined icon-checkmark\"\n >\n check\n </span>\n <span>{{ application.label }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n @if (accountStatuses()!.blocked.length) {\n <div class=\"application-status-indicator\">\n <span class=\"application-status-blocked application-status\">\n <span class=\"material-symbols-outlined icon-warning\">\n warning\n </span>\n <span class=\"application-count\">{{\n accountStatuses()!.blocked.length\n }}</span>\n </span>\n <div class=\"status-tooltip-container\">\n <div class=\"status-tooltip\">\n Blocked Applications\n <hr />\n @for (\n application of accountStatuses()!.blocked;\n track application.code\n ) {\n <div class=\"application-status\">\n <span\n class=\"material-symbols-outlined icon-warning\"\n >\n warning\n </span>\n <span>{{ application.label }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n @if (accountStatuses()!.none.length) {\n <div class=\"application-status-indicator\">\n <span class=\"application-status-none application-status\">\n <span class=\"material-symbols-outlined icon-lock\">\n lock\n </span>\n <span class=\"application-count\">{{\n accountStatuses()!.none.length\n }}</span>\n </span>\n <div class=\"status-tooltip-container\">\n <div class=\"status-tooltip\">\n No Account\n <hr />\n @for (\n application of accountStatuses()!.none;\n track application.label\n ) {\n <div class=\"application-status\">\n <span\n class=\"material-symbols-outlined icon-lock\"\n >\n lock\n </span>\n <span>{{ application.label }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"profile-details-container banner-group\">\n @for (detail of userInfoTabs() | keyvalue; track detail.key) {\n <div class=\"profile-detail\">\n <span class=\"soft label\">{{ detail.key }}</span>\n <lib-copy-tooltip [copyText]=\"detail.value\">\n <div class=\"profile-detail-tag white-tag clickable\">\n {{ detail.value || 'Unknown' }}\n </div>\n </lib-copy-tooltip>\n </div>\n }\n </div>\n <div class=\"profile-details-container banner-group\">\n <div class=\"profile-detail\">\n <span class=\"soft label\">Status</span>\n <div class=\"multiple-detail-tags\">\n <div\n class=\"profile-detail-tag color-tag\"\n title=\"{{ employeeStatusDescription() }}\"\n >\n {{ user()?.primary_position_type_display ?? 'Non-employee' }}\n @if (activityStatus()) {\n <span\n class=\"profile-status-circle\"\n [class.status-active]=\"activityStatus() === 'active'\"\n [class.status-inactive]=\"activityStatus() === 'inactive'\"\n [class.status-retired]=\"activityStatus() === 'retired'\"\n ></span>\n }\n </div>\n <div class=\"profile-detail-tag color-tag\">\n {{ (user()?.undergrad_graduate_status | titlecase) || 'Non-student' }}\n </div>\n <div class=\"profile-detail-tag color-tag\">\n {{ independentStudyStatus() ? 'Independent Study' : 'No Ind. Study' }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"spacer\"></div>\n <button class=\"end-impersonation-button shadow\" (click)=\"this.endImpersonation.emit()\">\n <span class=\"material-symbols-outlined icon\"> close </span>\n <span class=\"exit-text\">Exit</span>\n </button>\n </div>\n @if (isRestricted()) {\n <div class=\"restricted-bar-padding\"></div>\n <div class=\"restricted-bar\">\n <span class=\"title\">restricted person</span>\n <span class=\"text\">\n If anyone asks about this person, you are instructed to respond,\n <span class=\"emphasize\">\"We have no records for this person.\"</span>\n </span>\n </div>\n }\n <div class=\"right-border\"></div>\n <div class=\"bottom-border\"></div>\n <div class=\"left-border\"></div>\n}\n", styles: [".top-banner,.bottom-border,.right-border,.left-border{background-color:#9070bf;border:none;position:fixed;box-sizing:border-box;z-index:6000;font-size:1em}lib-copy-tooltip{z-index:10000;display:block}.top-banner,.bottom-border{left:0;right:0}.right-border,.left-border{width:7px;top:0;bottom:0}.top-banner{top:0;height:5em;display:flex;justify-content:space-between;width:100%;align-items:center;padding:2.5em;color:#f3f3f3}.bottom-border{bottom:0;height:7px}.right-border{right:0}.left-border{left:0}.banner-padding{padding-top:5em}.banner-group{display:flex;margin-right:1.6em}.profile-details-container{height:2.4em;display:flex;min-width:0}.profile-details-container .profile-detail{display:flex;flex-flow:column nowrap;align-items:flex-start;justify-content:space-between;margin-right:.6em;font-weight:600;min-width:0}.profile-details-container .profile-detail .label{font-size:.75em;white-space:nowrap;min-width:0;max-width:100%}.profile-details-container .profile-detail .profile-detail-tag{font-size:.8em;padding:.2em .4em;border-radius:5px;display:inline-flex;align-items:center;gap:.5em;white-space:nowrap;min-width:0;max-width:100%}.profile-details-container .profile-detail .profile-detail-tag:hover{min-width:max-content;z-index:1000}.profile-details-container .profile-detail .profile-detail-tag:last-of-type{margin-right:0}.profile-details-container .profile-detail .multiple-detail-tags{display:flex;flex-flow:row nowrap;min-width:0;max-width:100%}.profile-details-container .profile-detail .multiple-detail-tags .profile-detail-tag{margin-right:.6em}.profile-name-container{display:flex;align-items:center}.profile-name-container .profile-avatar{border-radius:50%;background-color:#fff;padding:0;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;color:#a9a9a9;align-self:center;font-size:15px;overflow:hidden;height:3.5em;width:3.5em;margin-right:.6em;flex-shrink:0}.profile-name-container .profile-avatar .profile-icon{margin:-.25em}.profile-name-container .profile-avatar .profile-image{height:100%;width:100%;object-fit:cover;font-size:1em}.profile-name-container .profile-avatar .profile-image+.profile-icon{display:none;font-size:3.5em}.profile-name-container .profile-avatar .profile-image:empty{display:none}.profile-name-container .profile-avatar .profile-image:empty+.profile-icon{display:block}.profile-name-container .profile-name-group{font-size:1em;font-weight:600}.profile-name-container .profile-name-group .profile-name-wrapper{display:flex;align-items:center;white-space:nowrap}.profile-name-container .profile-name-group .profile-name-wrapper .profile-name{font-size:1.6em;line-height:1em}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar{margin-left:1em;opacity:1;display:flex;align-items:center}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-indicator{position:relative;margin-right:.8em}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-indicator .application-count{margin-left:.5em;vertical-align:middle}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-indicator:last-child{margin-right:0}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status:hover+.status-tooltip-container{opacity:1}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-ok{color:#87ed8f}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-ok .icon-checkmark{background-color:#87ed8f;color:#9070bf;border-radius:50%;padding:.2em;font-size:1em;vertical-align:middle}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-blocked{color:#e9ce34}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-blocked .icon-warning{font-size:1.7em;vertical-align:middle}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-blocked .application-count{margin-left:.1em}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-none{color:#f4785b}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-none .icon-lock{background-color:#f4785b;color:#9070bf;border-radius:50%;padding:.2em;font-size:1em;vertical-align:middle}.profile-status-circle{width:.8em;height:.8em;border-radius:50%;flex-shrink:0}.status-active{background-color:#00e732}.status-retired{background-color:#ffba38}.status-inactive{border:2px white solid}.soft{opacity:.7}.end-impersonation-button{height:2.4em;cursor:pointer;border-radius:2em;font-size:1em;padding:0 1.4em 0 1em;border:none;outline:none;flex-shrink:0;background-color:#fff;color:#c63d3d;font-weight:600;transition:box-shadow .2s;display:flex;align-items:center}.end-impersonation-button:hover{box-shadow:#0003 0 8px 10px}.end-impersonation-button .icon{font-size:1.2em;margin-right:.2em}.spacer{flex-grow:1}.shadow{box-shadow:#0003 0 2px 10px}.white-tag{cursor:pointer;background-color:#ffffff26}.white-tag:hover{background-color:#614979}.color-tag:nth-of-type(1){background-color:#26acffcc}.color-tag:nth-of-type(2){background-color:#9394ffcc}.color-tag:nth-of-type(3){background-color:#a28ceecc}.status-tooltip-container{color:#fff;background-color:#2e2e2e;opacity:0;transition:all .1s ease-in-out;position:absolute;top:calc(100% + 1em);left:50%;transform:translate(-50%);border-radius:.4em}.status-tooltip-container:before{content:\"\";position:absolute;top:-.5em;left:50%;transform:translate(-50%);border-style:solid;border-width:0 1em 1em 1em;border-color:transparent transparent rgb(46,46,46) transparent}.status-tooltip{text-align:left;padding:.8em;line-height:2em;font-weight:700}.status-tooltip .application-status{display:flex;align-items:center;font-weight:400}.status-tooltip .application-status [class*=icon-]{font-size:1.2em;margin-right:.2em}.status-tooltip .application-status .icon-checkmark{color:#87ed8f}.status-tooltip .application-status .icon-warning{color:#e9ce34}.status-tooltip .application-status .icon-lock{color:#f4785b}.restricted-bar-padding{padding-top:40px}.restricted-bar{position:fixed;top:5em;left:7px;right:7px;height:40px;display:flex;align-items:center;color:#f3f3f3;background:repeating-linear-gradient(315deg,#c23737,#c23737 35px,#c25050 35px 70px);z-index:6000;font-size:1.6em}.restricted-bar .title{text-transform:uppercase;font-weight:600;margin:0 2em}.restricted-bar .text{margin:0 1em}.restricted-bar .text .emphasize{font-weight:600;font-style:italic}@media screen and (max-width: 1100px){.profile-name-group .soft{font-size:.7em}.profile-name-group .profile-name{font-size:1.3em}.end-impersonation-button{border-radius:50%;height:auto;padding:.6em}.end-impersonation-button .icon{margin:0}.end-impersonation-button .exit-text{display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }, { kind: "component", type: CopyTooltipComponent, selector: "lib-copy-tooltip", inputs: ["position", "copyText"] }] }); }
122
- }
123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllImpersonationBannerComponent, decorators: [{
124
- type: Component,
125
- args: [{ standalone: true, imports: [CommonModule, CopyTooltipComponent], selector: 'lib-hbll-impersonation-banner', template: "@if (isImpersonating()) {\n <div class=\"banner-padding\"></div>\n <div class=\"top-banner\">\n <div class=\"banner-group profile-name-container\">\n <div class=\"profile-avatar\">\n <div class=\"profile-image\">\n <img\n [src]=\"userPhotoUrl()\"\n [alt]=\"userFullName()\"\n alt=\"user photo\"\n onerror=\"this.remove()\"\n />\n </div>\n <span class=\"material-symbols-outlined profile-icon\"> person </span>\n </div>\n <div class=\"profile-name-group\">\n <span class=\"soft\">Impersonating</span>\n <div class=\"profile-name-wrapper\">\n <span class=\"profile-name\">{{ userFullName() }}</span>\n @if (accountStatuses()) {\n <div class=\"application-status-bar\">\n @if (accountStatuses()!.ok.length) {\n <div class=\"application-status-indicator\">\n <span class=\"application-status-ok application-status\">\n <span class=\"material-symbols-outlined icon-checkmark\">\n check\n </span>\n <span class=\"application-count\">{{\n accountStatuses()!.ok.length\n }}</span>\n </span>\n <div class=\"status-tooltip-container\">\n <div class=\"status-tooltip\">\n OK Applications\n <hr />\n @for (\n application of accountStatuses()!.ok;\n track application.label\n ) {\n <div class=\"application-status\">\n <span\n class=\"material-symbols-outlined icon-checkmark\"\n >\n check\n </span>\n <span>{{ application.label }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n @if (accountStatuses()!.blocked.length) {\n <div class=\"application-status-indicator\">\n <span class=\"application-status-blocked application-status\">\n <span class=\"material-symbols-outlined icon-warning\">\n warning\n </span>\n <span class=\"application-count\">{{\n accountStatuses()!.blocked.length\n }}</span>\n </span>\n <div class=\"status-tooltip-container\">\n <div class=\"status-tooltip\">\n Blocked Applications\n <hr />\n @for (\n application of accountStatuses()!.blocked;\n track application.code\n ) {\n <div class=\"application-status\">\n <span\n class=\"material-symbols-outlined icon-warning\"\n >\n warning\n </span>\n <span>{{ application.label }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n @if (accountStatuses()!.none.length) {\n <div class=\"application-status-indicator\">\n <span class=\"application-status-none application-status\">\n <span class=\"material-symbols-outlined icon-lock\">\n lock\n </span>\n <span class=\"application-count\">{{\n accountStatuses()!.none.length\n }}</span>\n </span>\n <div class=\"status-tooltip-container\">\n <div class=\"status-tooltip\">\n No Account\n <hr />\n @for (\n application of accountStatuses()!.none;\n track application.label\n ) {\n <div class=\"application-status\">\n <span\n class=\"material-symbols-outlined icon-lock\"\n >\n lock\n </span>\n <span>{{ application.label }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"profile-details-container banner-group\">\n @for (detail of userInfoTabs() | keyvalue; track detail.key) {\n <div class=\"profile-detail\">\n <span class=\"soft label\">{{ detail.key }}</span>\n <lib-copy-tooltip [copyText]=\"detail.value\">\n <div class=\"profile-detail-tag white-tag clickable\">\n {{ detail.value || 'Unknown' }}\n </div>\n </lib-copy-tooltip>\n </div>\n }\n </div>\n <div class=\"profile-details-container banner-group\">\n <div class=\"profile-detail\">\n <span class=\"soft label\">Status</span>\n <div class=\"multiple-detail-tags\">\n <div\n class=\"profile-detail-tag color-tag\"\n title=\"{{ employeeStatusDescription() }}\"\n >\n {{ user()?.primary_position_type_display ?? 'Non-employee' }}\n @if (activityStatus()) {\n <span\n class=\"profile-status-circle\"\n [class.status-active]=\"activityStatus() === 'active'\"\n [class.status-inactive]=\"activityStatus() === 'inactive'\"\n [class.status-retired]=\"activityStatus() === 'retired'\"\n ></span>\n }\n </div>\n <div class=\"profile-detail-tag color-tag\">\n {{ (user()?.undergrad_graduate_status | titlecase) || 'Non-student' }}\n </div>\n <div class=\"profile-detail-tag color-tag\">\n {{ independentStudyStatus() ? 'Independent Study' : 'No Ind. Study' }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"spacer\"></div>\n <button class=\"end-impersonation-button shadow\" (click)=\"this.endImpersonation.emit()\">\n <span class=\"material-symbols-outlined icon\"> close </span>\n <span class=\"exit-text\">Exit</span>\n </button>\n </div>\n @if (isRestricted()) {\n <div class=\"restricted-bar-padding\"></div>\n <div class=\"restricted-bar\">\n <span class=\"title\">restricted person</span>\n <span class=\"text\">\n If anyone asks about this person, you are instructed to respond,\n <span class=\"emphasize\">\"We have no records for this person.\"</span>\n </span>\n </div>\n }\n <div class=\"right-border\"></div>\n <div class=\"bottom-border\"></div>\n <div class=\"left-border\"></div>\n}\n", styles: [".top-banner,.bottom-border,.right-border,.left-border{background-color:#9070bf;border:none;position:fixed;box-sizing:border-box;z-index:6000;font-size:1em}lib-copy-tooltip{z-index:10000;display:block}.top-banner,.bottom-border{left:0;right:0}.right-border,.left-border{width:7px;top:0;bottom:0}.top-banner{top:0;height:5em;display:flex;justify-content:space-between;width:100%;align-items:center;padding:2.5em;color:#f3f3f3}.bottom-border{bottom:0;height:7px}.right-border{right:0}.left-border{left:0}.banner-padding{padding-top:5em}.banner-group{display:flex;margin-right:1.6em}.profile-details-container{height:2.4em;display:flex;min-width:0}.profile-details-container .profile-detail{display:flex;flex-flow:column nowrap;align-items:flex-start;justify-content:space-between;margin-right:.6em;font-weight:600;min-width:0}.profile-details-container .profile-detail .label{font-size:.75em;white-space:nowrap;min-width:0;max-width:100%}.profile-details-container .profile-detail .profile-detail-tag{font-size:.8em;padding:.2em .4em;border-radius:5px;display:inline-flex;align-items:center;gap:.5em;white-space:nowrap;min-width:0;max-width:100%}.profile-details-container .profile-detail .profile-detail-tag:hover{min-width:max-content;z-index:1000}.profile-details-container .profile-detail .profile-detail-tag:last-of-type{margin-right:0}.profile-details-container .profile-detail .multiple-detail-tags{display:flex;flex-flow:row nowrap;min-width:0;max-width:100%}.profile-details-container .profile-detail .multiple-detail-tags .profile-detail-tag{margin-right:.6em}.profile-name-container{display:flex;align-items:center}.profile-name-container .profile-avatar{border-radius:50%;background-color:#fff;padding:0;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;color:#a9a9a9;align-self:center;font-size:15px;overflow:hidden;height:3.5em;width:3.5em;margin-right:.6em;flex-shrink:0}.profile-name-container .profile-avatar .profile-icon{margin:-.25em}.profile-name-container .profile-avatar .profile-image{height:100%;width:100%;object-fit:cover;font-size:1em}.profile-name-container .profile-avatar .profile-image+.profile-icon{display:none;font-size:3.5em}.profile-name-container .profile-avatar .profile-image:empty{display:none}.profile-name-container .profile-avatar .profile-image:empty+.profile-icon{display:block}.profile-name-container .profile-name-group{font-size:1em;font-weight:600}.profile-name-container .profile-name-group .profile-name-wrapper{display:flex;align-items:center;white-space:nowrap}.profile-name-container .profile-name-group .profile-name-wrapper .profile-name{font-size:1.6em;line-height:1em}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar{margin-left:1em;opacity:1;display:flex;align-items:center}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-indicator{position:relative;margin-right:.8em}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-indicator .application-count{margin-left:.5em;vertical-align:middle}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-indicator:last-child{margin-right:0}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status:hover+.status-tooltip-container{opacity:1}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-ok{color:#87ed8f}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-ok .icon-checkmark{background-color:#87ed8f;color:#9070bf;border-radius:50%;padding:.2em;font-size:1em;vertical-align:middle}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-blocked{color:#e9ce34}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-blocked .icon-warning{font-size:1.7em;vertical-align:middle}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-blocked .application-count{margin-left:.1em}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-none{color:#f4785b}.profile-name-container .profile-name-group .profile-name-wrapper .application-status-bar .application-status-none .icon-lock{background-color:#f4785b;color:#9070bf;border-radius:50%;padding:.2em;font-size:1em;vertical-align:middle}.profile-status-circle{width:.8em;height:.8em;border-radius:50%;flex-shrink:0}.status-active{background-color:#00e732}.status-retired{background-color:#ffba38}.status-inactive{border:2px white solid}.soft{opacity:.7}.end-impersonation-button{height:2.4em;cursor:pointer;border-radius:2em;font-size:1em;padding:0 1.4em 0 1em;border:none;outline:none;flex-shrink:0;background-color:#fff;color:#c63d3d;font-weight:600;transition:box-shadow .2s;display:flex;align-items:center}.end-impersonation-button:hover{box-shadow:#0003 0 8px 10px}.end-impersonation-button .icon{font-size:1.2em;margin-right:.2em}.spacer{flex-grow:1}.shadow{box-shadow:#0003 0 2px 10px}.white-tag{cursor:pointer;background-color:#ffffff26}.white-tag:hover{background-color:#614979}.color-tag:nth-of-type(1){background-color:#26acffcc}.color-tag:nth-of-type(2){background-color:#9394ffcc}.color-tag:nth-of-type(3){background-color:#a28ceecc}.status-tooltip-container{color:#fff;background-color:#2e2e2e;opacity:0;transition:all .1s ease-in-out;position:absolute;top:calc(100% + 1em);left:50%;transform:translate(-50%);border-radius:.4em}.status-tooltip-container:before{content:\"\";position:absolute;top:-.5em;left:50%;transform:translate(-50%);border-style:solid;border-width:0 1em 1em 1em;border-color:transparent transparent rgb(46,46,46) transparent}.status-tooltip{text-align:left;padding:.8em;line-height:2em;font-weight:700}.status-tooltip .application-status{display:flex;align-items:center;font-weight:400}.status-tooltip .application-status [class*=icon-]{font-size:1.2em;margin-right:.2em}.status-tooltip .application-status .icon-checkmark{color:#87ed8f}.status-tooltip .application-status .icon-warning{color:#e9ce34}.status-tooltip .application-status .icon-lock{color:#f4785b}.restricted-bar-padding{padding-top:40px}.restricted-bar{position:fixed;top:5em;left:7px;right:7px;height:40px;display:flex;align-items:center;color:#f3f3f3;background:repeating-linear-gradient(315deg,#c23737,#c23737 35px,#c25050 35px 70px);z-index:6000;font-size:1.6em}.restricted-bar .title{text-transform:uppercase;font-weight:600;margin:0 2em}.restricted-bar .text{margin:0 1em}.restricted-bar .text .emphasize{font-weight:600;font-style:italic}@media screen and (max-width: 1100px){.profile-name-group .soft{font-size:.7em}.profile-name-group .profile-name{font-size:1.3em}.end-impersonation-button{border-radius:50%;height:auto;padding:.6em}.end-impersonation-button .icon{margin:0}.end-impersonation-button .exit-text{display:none}}\n"] }]
126
- }], propDecorators: { endImpersonation: [{
127
- type: Output
128
- }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1pbXBlcnNvbmF0aW9uLWJhbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvaGJsbC1pbXBlcnNvbmF0aW9uLWJhbm5lci9oYmxsLWltcGVyc29uYXRpb24tYmFubmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWltcGVyc29uYXRpb24tYmFubmVyL2hibGwtaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUNILFlBQVksR0FHZixNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7O0FBRTlFLE1BQU0sY0FBYyxHQUFHLDREQUE0RCxDQUFDO0FBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsc0JBQXNCLENBQUM7QUFD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LCBjb21wdXRlZCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIGlucHV0LCBPdXRwdXQsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICAgIEFjY2Vzc1N0YXR1cyxcbiAgICBBY2NvdW50c1Jlc3BvbnNlLFxuICAgIHR5cGUgQXBwbGljYXRpb25BY2Nlc3MsXG59IGZyb20gJy4uL2hibGwtaGVhZGVyL21vZGVscy9hcHBsaWNhdGlvbi1hY2Nlc3MnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRva2VuUGF5bG9hZCB9IGZyb20gJy4uL2hibGwtaGVhZGVyL21vZGVscy90b2tlbi1wYXlsb2FkJztcbmltcG9ydCB7IGp3dERlY29kZSwgSnd0UGF5bG9hZCB9IGZyb20gJ2p3dC1kZWNvZGUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmRlcGVuZGVudFN0dWR5UmVzcG9uc2UsIFBlcnNvblN1bW1hcnkgfSBmcm9tICcuLi9oYmxsLWhlYWRlci9tb2RlbHMvcGVyc29uLXN1bW1hcnknO1xuaW1wb3J0IHVybGNhdCBmcm9tICd1cmxjYXQnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvcHlUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vY29weS10b29sdGlwL2NvcHktdG9vbHRpcC5jb21wb25lbnQnO1xuXG5jb25zdCBVU0VSX1BIT1RPX1VSTCA9ICdodHRwczovL3kuYnl1LmVkdS9yeS9hZS9wcm9kL3BlcnNvbi9jZ2kvcGVyc29uUGhvdG8uY2dpP249JztcbmNvbnN0IFBFUlNPTl9TVU1NQVJZX1BBVEggPSAnL3N1bW1hcnkvOmxpYnJhcnlJZC8nO1xuY29uc3QgUEVSU09OX0JBU0VfVVJJID0gJ2h0dHBzOi8vYXBwcy5saWIuYnl1LmVkdS9wZXJzb24vdjIvJztcbmNvbnN0IElOREVQRU5ERU5UX1NUVURZX1JFU1BPTlNFX1BBVEggPSAnL2luZGVwZW5kZW50LXN0dWR5LzpsaWJyYXJ5SWQvJztcbmNvbnN0IFBBVFJPTl9BQ0NPVU5UU19QQVRIID0gJy9wYXRyb24vYWNjb3VudHMnO1xuY29uc3QgTElCUkFSWV9BUElfQkFTRV9VUkkgPSAnaHR0cHM6Ly9hcHBzLmxpYi5ieXUuZWR1L3YxJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDb3B5VG9vbHRpcENvbXBvbmVudF0sXG4gICAgc2VsZWN0b3I6ICdsaWItaGJsbC1pbXBlcnNvbmF0aW9uLWJhbm5lcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hibGwtaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2hibGwtaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbEltcGVyc29uYXRpb25CYW5uZXJDb21wb25lbnQge1xuICAgIHByaXZhdGUgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgICBhY2Nlc3NUb2tlblBheWxvYWQgPSBpbnB1dC5yZXF1aXJlZDxUb2tlblBheWxvYWQ+KCk7XG4gICAgQE91dHB1dCgpIGVuZEltcGVyc29uYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcGFyc2VkVG9rZW46IFNpZ25hbDxKd3RQYXlsb2FkICYgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuUGF5bG9hZCgpLnRva2VuID8gand0RGVjb2RlKHRoaXMuYWNjZXNzVG9rZW5QYXlsb2FkKCkudG9rZW4pIDoge30sXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgaXNJbXBlcnNvbmF0aW5nID0gY29tcHV0ZWQoKCkgPT4gISF0aGlzLnBhcnNlZFRva2VuKClbJ2ltcGVyc29uYXRvciddKTtcbiAgICBwcm90ZWN0ZWQgbGlicmFyeUlkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYXJzZWRUb2tlbigpWydsaWJyYXJ5X2lkJ10pO1xuICAgIHByb3RlY3RlZCB1c2VyID0gdG9TaWduYWwoXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RvT2JzZXJ2YWJsZSh0aGlzLmxpYnJhcnlJZCksIHRvT2JzZXJ2YWJsZSh0aGlzLmlzSW1wZXJzb25hdGluZyldKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbbGlicmFyeUlkLCBpc0ltcGVyc29uYXRpbmddKSA9PlxuICAgICAgICAgICAgICAgIGxpYnJhcnlJZCAmJiBpc0ltcGVyc29uYXRpbmdcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmh0dHAuZ2V0PFBlcnNvblN1bW1hcnk+KFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxjYXQoUEVSU09OX0JBU0VfVVJJLCBQRVJTT05fU1VNTUFSWV9QQVRILCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYWNjZXNzVG9rZW5QYXlsb2FkKCkudG9rZW59YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IG9mKG51bGwpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIHByb3RlY3RlZCB1c2VyRnVsbE5hbWUgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLnBhcnNlZFRva2VuKClbJ2dpdmVuX25hbWUnXVxuICAgICAgICAgICAgPyBgJHt0aGlzLnBhcnNlZFRva2VuKClbJ2dpdmVuX25hbWUnXX0gJHt0aGlzLnBhcnNlZFRva2VuKClbJ2ZhbWlseV9uYW1lJ119YFxuICAgICAgICAgICAgOiAnVW5rbm93bicsXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgaXNSZXN0cmljdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy51c2VyKCk/LnJlc3RyaWN0ZWQpO1xuICAgIHByb3RlY3RlZCB1c2VySW5mb1RhYnMgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIG5ldyBNYXAoW1xuICAgICAgICAgICAgICAgIFsnTmV0IElEJywgdGhpcy5wYXJzZWRUb2tlbigpWyduZXRfaWQnXSA/PyAnJ10sXG4gICAgICAgICAgICAgICAgWydCWVUgSUQnLCB0aGlzLnBhcnNlZFRva2VuKClbJ2J5dV9pZCddID8/ICcnXSxcbiAgICAgICAgICAgICAgICBbJ0VtYWlsJywgdGhpcy5wYXJzZWRUb2tlbigpWydlbWFpbCddID8/ICcnXSxcbiAgICAgICAgICAgIF0pLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHVzZXJQaG90b1VybCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucGFyc2VkVG9rZW4oKVsnbmV0X2lkJ10gPyBVU0VSX1BIT1RPX1VSTCArIHRoaXMucGFyc2VkVG9rZW4oKVsnbmV0X2lkJ10gOiAnJyxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIGFjdGl2aXR5U3RhdHVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy51c2VyKCk/LmlzX3JldGlyZWQpIHJldHVybiAncmV0aXJlZCc7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudXNlcigpPy5pc19lbXBsb3llZSkgcmV0dXJuICdhY3RpdmUnO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnVzZXIoKT8ucHJpbWFyeV9wb3NpdGlvbl90eXBlKSByZXR1cm4gJ2luYWN0aXZlJztcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgZW1wbG95ZWVTdGF0dXNEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgaWYgKHRoaXMudXNlcigpIS5pc19yZXRpcmVkKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdSZXRpcmVkJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVzZXIoKSEuaXNfZW1wbG95ZWUpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gJ0FjdGl2ZSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VyKCkhLnByaW1hcnlfcG9zaXRpb25fdHlwZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnSW5hY3RpdmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlcigpIS5wcmltYXJ5X3Bvc2l0aW9uX3R5cGVfZGlzcGxheSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gYCAke3RoaXMudXNlcigpIS5wcmltYXJ5X3Bvc2l0aW9uX3R5cGVfZGlzcGxheX0gRW1wbG95ZWVgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgaW5kZXBlbmRlbnRTdHVkeVN0YXR1cyA9IHRvU2lnbmFsKFxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0b09ic2VydmFibGUodGhpcy5saWJyYXJ5SWQpLCB0b09ic2VydmFibGUodGhpcy5pc0ltcGVyc29uYXRpbmcpXSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoW2xpYnJhcnlJZCwgaXNJbXBlcnNvbmF0aW5nXSkgPT5cbiAgICAgICAgICAgICAgICBsaWJyYXJ5SWQgJiYgaXNJbXBlcnNvbmF0aW5nXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5odHRwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQ8SW5kZXBlbmRlbnRTdHVkeVJlc3BvbnNlPihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGNhdChQRVJTT05fQkFTRV9VUkksIElOREVQRU5ERU5UX1NUVURZX1JFU1BPTlNFX1BBVEgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmFjY2Vzc1Rva2VuUGF5bG9hZCgpLnRva2VufWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUobWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2U/LmlzX2Vucm9sbGVkKSlcbiAgICAgICAgICAgICAgICAgICAgOiBvZihudWxsKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFN0YXR1c2VzID0gdG9TaWduYWwoXG4gICAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLmlzSW1wZXJzb25hdGluZykucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoaXNJbXBlcnNvbmF0aW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0ltcGVyc29uYXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAgICAgICAgIC5nZXQ8QWNjb3VudHNSZXNwb25zZT4odXJsY2F0KExJQlJBUllfQVBJX0JBU0VfVVJJLCBQQVRST05fQUNDT1VOVFNfUEFUSCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hY2Nlc3NUb2tlblBheWxvYWQoKS50b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGFjY291bnRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjb3VudFN0YXR1c2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogW10gYXMgQXBwbGljYXRpb25BY2Nlc3NbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tlZDogW10gYXMgQXBwbGljYXRpb25BY2Nlc3NbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uZTogW10gYXMgQXBwbGljYXRpb25BY2Nlc3NbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhhY2NvdW50cy5hcHBsaWNhdGlvbnMpLmZvckVhY2goKGFwcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFwcC5hY2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzU3RhdHVzLk9LOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRTdGF0dXNlcy5vay5wdXNoKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjY2Vzc1N0YXR1cy5CTE9DS0VEOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRTdGF0dXNlcy5ibG9ja2VkLnB1c2goYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzU3RhdHVzLk5PTkU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudFN0YXR1c2VzLm5vbmUucHVzaChhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjb3VudFN0YXR1c2VzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIFNUQVRVU0VTID0gQWNjZXNzU3RhdHVzO1xufVxuIiwiQGlmIChpc0ltcGVyc29uYXRpbmcoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItcGFkZGluZ1wiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFubmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItZ3JvdXAgcHJvZmlsZS1uYW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtaW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJ1c2VyUGhvdG9VcmwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cInVzZXJGdWxsTmFtZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInVzZXIgcGhvdG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcj1cInRoaXMucmVtb3ZlKClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBwcm9maWxlLWljb25cIj4gcGVyc29uIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtbmFtZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29mdFwiPkltcGVyc29uYXRpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtbmFtZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvZmlsZS1uYW1lXCI+e3sgdXNlckZ1bGxOYW1lKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoYWNjb3VudFN0YXR1c2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBsaWNhdGlvbi1zdGF0dXMtYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChhY2NvdW50U3RhdHVzZXMoKSEub2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBsaWNhdGlvbi1zdGF0dXMtaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwcGxpY2F0aW9uLXN0YXR1cy1vayBhcHBsaWNhdGlvbi1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvbi1jaGVja21hcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHBsaWNhdGlvbi1jb3VudFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRTdGF0dXNlcygpIS5vay5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtdG9vbHRpcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0sgQXBwbGljYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG9mIGFjY291bnRTdGF0dXNlcygpIS5vaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGFwcGxpY2F0aW9uLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGxpY2F0aW9uLXN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uLWNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBhcHBsaWNhdGlvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoYWNjb3VudFN0YXR1c2VzKCkhLmJsb2NrZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBsaWNhdGlvbi1zdGF0dXMtaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwcGxpY2F0aW9uLXN0YXR1cy1ibG9ja2VkIGFwcGxpY2F0aW9uLXN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uLXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwcGxpY2F0aW9uLWNvdW50XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudFN0YXR1c2VzKCkhLmJsb2NrZWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLXRvb2x0aXAtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrZWQgQXBwbGljYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG9mIGFjY291bnRTdGF0dXNlcygpIS5ibG9ja2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgYXBwbGljYXRpb24uY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBsaWNhdGlvbi1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvbi13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgYXBwbGljYXRpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFjY291bnRTdGF0dXNlcygpIS5ub25lLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwbGljYXRpb24tc3RhdHVzLWluZGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHBsaWNhdGlvbi1zdGF0dXMtbm9uZSBhcHBsaWNhdGlvbi1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvbi1sb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHBsaWNhdGlvbi1jb3VudFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRTdGF0dXNlcygpIS5ub25lLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy10b29sdGlwLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtdG9vbHRpcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBBY2NvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG9mIGFjY291bnRTdGF0dXNlcygpIS5ub25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgYXBwbGljYXRpb24ubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwbGljYXRpb24tc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb24tbG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGFwcGxpY2F0aW9uLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZmlsZS1kZXRhaWxzLWNvbnRhaW5lciBiYW5uZXItZ3JvdXBcIj5cbiAgICAgICAgICAgIEBmb3IgKGRldGFpbCBvZiB1c2VySW5mb1RhYnMoKSB8IGtleXZhbHVlOyB0cmFjayBkZXRhaWwua2V5KSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtZGV0YWlsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29mdCBsYWJlbFwiPnt7IGRldGFpbC5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItY29weS10b29sdGlwIFtjb3B5VGV4dF09XCJkZXRhaWwudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9maWxlLWRldGFpbC10YWcgd2hpdGUtdGFnIGNsaWNrYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRldGFpbC52YWx1ZSB8fCAnVW5rbm93bicgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1jb3B5LXRvb2x0aXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZmlsZS1kZXRhaWxzLWNvbnRhaW5lciBiYW5uZXItZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9maWxlLWRldGFpbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29mdCBsYWJlbFwiPlN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGlwbGUtZGV0YWlsLXRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9maWxlLWRldGFpbC10YWcgY29sb3ItdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgZW1wbG95ZWVTdGF0dXNEZXNjcmlwdGlvbigpIH19XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdXNlcigpPy5wcmltYXJ5X3Bvc2l0aW9uX3R5cGVfZGlzcGxheSA/PyAnTm9uLWVtcGxveWVlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChhY3Rpdml0eVN0YXR1cygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9maWxlLXN0YXR1cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc3RhdHVzLWFjdGl2ZV09XCJhY3Rpdml0eVN0YXR1cygpID09PSAnYWN0aXZlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zdGF0dXMtaW5hY3RpdmVdPVwiYWN0aXZpdHlTdGF0dXMoKSA9PT0gJ2luYWN0aXZlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zdGF0dXMtcmV0aXJlZF09XCJhY3Rpdml0eVN0YXR1cygpID09PSAncmV0aXJlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZmlsZS1kZXRhaWwtdGFnIGNvbG9yLXRhZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKHVzZXIoKT8udW5kZXJncmFkX2dyYWR1YXRlX3N0YXR1cyB8IHRpdGxlY2FzZSkgfHwgJ05vbi1zdHVkZW50JyB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtZGV0YWlsLXRhZyBjb2xvci10YWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGluZGVwZW5kZW50U3R1ZHlTdGF0dXMoKSA/ICdJbmRlcGVuZGVudCBTdHVkeScgOiAnTm8gSW5kLiBTdHVkeScgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVuZC1pbXBlcnNvbmF0aW9uLWJ1dHRvbiBzaGFkb3dcIiAoY2xpY2spPVwidGhpcy5lbmRJbXBlcnNvbmF0aW9uLmVtaXQoKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb25cIj4gY2xvc2UgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleGl0LXRleHRcIj5FeGl0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGlzUmVzdHJpY3RlZCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN0cmljdGVkLWJhci1wYWRkaW5nXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN0cmljdGVkLWJhclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnJlc3RyaWN0ZWQgcGVyc29uPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0XCI+XG4gICAgICAgICAgICAgICAgSWYgYW55b25lIGFza3MgYWJvdXQgdGhpcyBwZXJzb24sIHlvdSBhcmUgaW5zdHJ1Y3RlZCB0byByZXNwb25kLFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1waGFzaXplXCI+XCJXZSBoYXZlIG5vIHJlY29yZHMgZm9yIHRoaXMgcGVyc29uLlwiPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LWJvcmRlclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJib3R0b20tYm9yZGVyXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxlZnQtYm9yZGVyXCI+PC9kaXY+XG59XG4iXX0=