@alauda-fe/common
Version:
Alauda frontend team common codes.
178 lines • 32.3 kB
JavaScript
import { inject } from '@angular/core';
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
import { ActivatedRoute, Router } from '@angular/router';
import { NEVER, Subject, catchError, filter, interval, isObservable, map, of, startWith, switchMap, switchScan, take, withLatestFrom, } from 'rxjs';
import { WatchEvent } from '../api/public-api';
import { DOWNGRADE_WATCH_ENABLED, DOWNGRADE_WATCH_POLLING, publishRef, } from '../core/public-api';
import { normalizeParams } from './utils';
export class K8SResourcePagedList {
constructor(config) {
this.config = config;
this.reload$$ = new Subject();
this.addedUid = new Set();
this.deletedUid = new Set();
this.params$ = isObservable(this.config.params)
? this.config.params
: toObservable(this.config.params);
this.loadState$ = this.config.watcher && !DOWNGRADE_WATCH_ENABLED
? this.loadStateWithWatcher()
: this.config.watcher || this.config.polling
? this.loadStateWithPolling()
: this.sourceLoadState();
this.loading$ = this.loadState$.pipe(map(state => state.loading));
this.items$ = this.loadState$.pipe(map(state => state.items));
this.totalItems$ = this.loadState$.pipe(map(state => state.totalItems));
this.loadError$ = this.loadState$.pipe(map(state => state.loadError));
this.$loading = toSignal(this.loading$);
this.$items = toSignal(this.items$);
this.$totalItems = toSignal(this.totalItems$);
this.$loadError = toSignal(this.loadError$);
}
reload() {
this.reload$$.next();
}
sourceLoadState() {
return this.params$.pipe(map(parseListParams), switchMap(({ listParams, extraParams }) => {
return this.reload$$.pipe(startWith(null), switchMap(() => {
return this.config.fetcher(listParams, extraParams).pipe(map(list => ({
loading: false,
loadSuccess: true,
items: list.items ?? [],
totalItems: list.metadata.totalItems ?? 0,
})), startWith({
loading: true,
loadSuccess: false,
items: [],
totalItems: 0,
}), catchError((err) => of({
loading: false,
loadSuccess: false,
loadError: err,
items: [],
totalItems: 0,
})));
}));
}), publishRef());
}
loadStateWithPolling() {
return this.sourceLoadState().pipe(switchMap(sourceState => sourceState.loadSuccess
? interval(this.config.polling || DOWNGRADE_WATCH_POLLING).pipe(withLatestFrom(this.params$), map(([_, params]) => parseListParams(params)), switchMap(({ listParams, extraParams }) => this.config.fetcher(listParams, extraParams).pipe(map(list => ({
...sourceState,
items: list.items,
totalItems: list.metadata.totalItems,
})), catchError(() => NEVER))), startWith(sourceState))
: of(sourceState)), publishRef());
}
loadStateWithWatcher() {
return this.sourceLoadState().pipe(switchMap(sourceState => sourceState.loadSuccess
? this.params$.pipe(take(1), switchMap(params => {
const watchParams = parseListParams({
keyword: params.keyword,
extra: params.extra,
});
const fetchParams = parseListParams(params);
return this.config
.watcher(watchParams.listParams, watchParams.extraParams)
.pipe(filter(({ type, object }) => {
switch (type) {
case WatchEvent.Added: {
if (this.addedUid.has(object.metadata.uid)) {
return false;
}
this.addedUid.add(object.metadata.uid);
return true;
}
case WatchEvent.Deleted: {
if (this.deletedUid.has(object.metadata.uid)) {
return false;
}
this.deletedUid.add(object.metadata.uid);
return true;
}
default: {
return true;
}
}
}), switchScan((state, { type, object }) => {
switch (type) {
case WatchEvent.Modified: {
return of({
...state,
items: state.items.map(item => item.metadata.uid === object.metadata.uid
? object
: item),
});
}
case WatchEvent.Added:
case WatchEvent.Deleted: {
return this.config
.fetcher(fetchParams.listParams, fetchParams.extraParams)
.pipe(map(list => ({
...state,
items: list.items,
totalItems: list.metadata.totalItems,
})), catchError(() => NEVER));
}
default: {
return NEVER;
}
}
}, sourceState));
}), startWith(sourceState))
: of(sourceState)), publishRef());
}
}
export function extractPagedListParams(defaultParams = {}, extraParams) {
const route = inject(ActivatedRoute);
const params$ = route.queryParams.pipe(map(params => normalizeParams({
pageIndex: 0,
pageSize: 20,
...defaultParams,
...(params.pageIndex ? { pageIndex: params.pageIndex } : {}),
...(params.pageSize ? { pageSize: params.pageSize } : {}),
...(params.keyword ? { keyword: params.keyword } : {}),
...(params.sortField ? { sortField: params.sortField } : {}),
...(params.sortOrder ? { sortOrder: params.sortOrder } : {}),
...(params.fieldSelector
? { fieldSelector: params.fieldSelector }
: {}),
...(params.labelSelector
? { labelSelector: params.labelSelector }
: {}),
...(extraParams ? { extra: extraParams(params) } : {}),
})));
return {
stream: () => params$,
signal: () => toSignal(params$),
};
}
export function queryListParams() {
const router = inject(Router);
const route = inject(ActivatedRoute);
return (queryParams) => {
router.navigate(['./'], {
relativeTo: route,
queryParamsHandling: 'merge',
queryParams: normalizeParams(queryParams),
});
};
}
function parseListParams({ pageIndex, pageSize, sortField, sortOrder, keyword, fieldSelector: originFieldSelector, labelSelector, extra: extraParams, }) {
const search = keyword ? `search=${keyword}` : '';
const sortBy = sortField
? `sortby=${sortOrder === 'desc' ? '-' : ''}${sortField}`
: '';
const fieldSelector = [search, sortBy, originFieldSelector]
.filter(v => !!v)
.join(',');
return {
listParams: {
limit: (pageSize || 20) + '',
continue: +(pageIndex || 0) * +(pageSize || 20) + '',
...(labelSelector ? { labelSelector } : {}),
...(fieldSelector ? { fieldSelector } : {}),
},
extraParams,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXJlc291cmNlLXBhZ2VkLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvazhzLXJlc291cmNlLWxpc3QvazhzLXJlc291cmNlLXBhZ2VkLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUNMLEtBQUssRUFFTCxPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsWUFBWSxFQUNaLEdBQUcsRUFDSCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFJdkIsVUFBVSxHQUNYLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUxQyxNQUFNLE9BQU8sb0JBQW9CO0lBNkIvQixZQUE2QixNQUE2QjtRQUE3QixXQUFNLEdBQU4sTUFBTSxDQUF1QjtRQXpCekMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsYUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDN0IsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFaEQsWUFBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1B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QUFTLEVBQ1QsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsT0FBTyxFQUNQLGFBQWEsRUFBRSxtQkFBbUIsRUFDbEMsYUFBYSxFQUNiLEtBQUssRUFBRSxXQUFXLEdBQ0M7SUFDbkIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsU0FBUztRQUN0QixDQUFDLENBQUMsVUFBVSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUU7UUFDekQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQztTQUN4RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLE9BQU87UUFDTCxVQUFVLEVBQUU7WUFDVixLQUFLLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUM1QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDcEQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMvQjtRQUNkLFdBQVc7S0FDWixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU2lnbmFsLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgTkVWRVIsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGZpbHRlcixcbiAgaW50ZXJ2YWwsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBvZixcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHN3aXRjaFNjYW4sXG4gIHRha2UsXG4gIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgV2F0Y2hBUElSZXNwb25zZSwgV2F0Y2hFdmVudCB9IGZyb20gJy4uL2FwaS9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIERPV05HUkFERV9XQVRDSF9FTkFCTEVELFxuICBET1dOR1JBREVfV0FUQ0hfUE9MTElORyxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0LFxuICBTdGF0dXMsXG4gIHB1Ymxpc2hSZWYsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVBhcmFtcyB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgSzhTUmVzb3VyY2VQYWdlZExpc3Q8XG4gIFIgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2UgPSBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gIFAgPSB1bmtub3duLFxuPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVsb2FkJCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZGVkVWlkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZFVpZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHBhcmFtcyQgPSBpc09ic2VydmFibGUodGhpcy5jb25maWcucGFyYW1zKVxuICAgID8gdGhpcy5jb25maWcucGFyYW1zXG4gICAgOiB0b09ic2VydmFibGUodGhpcy5jb25maWcucGFyYW1zKTtcblxuICBsb2FkU3RhdGUkID1cbiAgICB0aGlzLmNvbmZpZy53YXRjaGVyICYmICFET1dOR1JBREVfV0FUQ0hfRU5BQkxFRFxuICAgICAgPyB0aGlzLmxvYWRTdGF0ZVdpdGhXYXRjaGVyKClcbiAgICAgIDogdGhpcy5jb25maWcud2F0Y2hlciB8fCB0aGlzLmNvbmZpZy5wb2xsaW5nXG4gICAgICAgID8gdGhpcy5sb2FkU3RhdGVXaXRoUG9sbGluZygpXG4gICAgICAgIDogdGhpcy5zb3VyY2VMb2FkU3RhdGUoKTtcblxuICBsb2FkaW5nJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5sb2FkaW5nKSk7XG4gIGl0ZW1zJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5pdGVtcykpO1xuICB0b3RhbEl0ZW1zJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS50b3RhbEl0ZW1zKSk7XG4gIGxvYWRFcnJvciQgPSB0aGlzLmxvYWRTdGF0ZSQucGlwZShtYXAoc3RhdGUgPT4gc3RhdGUubG9hZEVycm9yKSk7XG5cbiAgJGxvYWRpbmcgPSB0b1NpZ25hbCh0aGlzLmxvYWRpbmckKTtcbiAgJGl0ZW1zID0gdG9TaWduYWwodGhpcy5pdGVtcyQpO1xuICAkdG90YWxJdGVtcyA9IHRvU2lnbmFsKHRoaXMudG90YWxJdGVtcyQpO1xuICAkbG9hZEVycm9yID0gdG9TaWduYWwodGhpcy5sb2FkRXJyb3IkKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUGFnZWRMaXN0Q29uZmlnPFIsIFA+KSB7fVxuXG4gIHJlbG9hZCgpIHtcbiAgICB0aGlzLnJlbG9hZCQkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc291cmNlTG9hZFN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcyQucGlwZShcbiAgICAgIG1hcChwYXJzZUxpc3RQYXJhbXMpLFxuICAgICAgc3dpdGNoTWFwKCh7IGxpc3RQYXJhbXMsIGV4dHJhUGFyYW1zIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkJCQucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpOiBPYnNlcnZhYmxlPExvYWRTdGF0ZTxSPj4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmZldGNoZXIobGlzdFBhcmFtcywgZXh0cmFQYXJhbXMpLnBpcGUoXG4gICAgICAgICAgICAgIG1hcChsaXN0ID0+ICh7XG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgbG9hZFN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgaXRlbXM6IGxpc3QuaXRlbXMgPz8gW10sXG4gICAgICAgICAgICAgICAgdG90YWxJdGVtczogbGlzdC5tZXRhZGF0YS50b3RhbEl0ZW1zID8/IDAsXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgc3RhcnRXaXRoKHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvYWRTdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICAgICAgdG90YWxJdGVtczogMCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogU3RhdHVzIHwgSHR0cEVycm9yUmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgb2Yoe1xuICAgICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBsb2FkU3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBsb2FkRXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXM6IDAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0YXRlV2l0aFBvbGxpbmcoKTogT2JzZXJ2YWJsZTxMb2FkU3RhdGU8Uj4+IHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VMb2FkU3RhdGUoKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHNvdXJjZVN0YXRlID0+XG4gICAgICAgIHNvdXJjZVN0YXRlLmxvYWRTdWNjZXNzXG4gICAgICAgICAgPyBpbnRlcnZhbCh0aGlzLmNvbmZpZy5wb2xsaW5nIHx8IERPV05HUkFERV9XQVRDSF9QT0xMSU5HKS5waXBlKFxuICAgICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnBhcmFtcyQpLFxuICAgICAgICAgICAgICBtYXAoKFtfLCBwYXJhbXNdKSA9PiBwYXJzZUxpc3RQYXJhbXMocGFyYW1zKSksXG4gICAgICAgICAgICAgIHN3aXRjaE1hcCgoeyBsaXN0UGFyYW1zLCBleHRyYVBhcmFtcyB9KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmZldGNoZXIobGlzdFBhcmFtcywgZXh0cmFQYXJhbXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICBtYXAobGlzdCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5zb3VyY2VTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGxpc3QuaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXM6IGxpc3QubWV0YWRhdGEudG90YWxJdGVtcyxcbiAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gTkVWRVIpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHN0YXJ0V2l0aChzb3VyY2VTdGF0ZSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBvZihzb3VyY2VTdGF0ZSksXG4gICAgICApLFxuICAgICAgcHVibGlzaFJlZigpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRTdGF0ZVdpdGhXYXRjaGVyKCk6IE9ic2VydmFibGU8TG9hZFN0YXRlPFI+PiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTG9hZFN0YXRlKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcChzb3VyY2VTdGF0ZSA9PlxuICAgICAgICBzb3VyY2VTdGF0ZS5sb2FkU3VjY2Vzc1xuICAgICAgICAgID8gdGhpcy5wYXJhbXMkLnBpcGUoXG4gICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoUGFyYW1zID0gcGFyc2VMaXN0UGFyYW1zKHtcbiAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IHBhcmFtcy5rZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgZXh0cmE6IHBhcmFtcy5leHRyYSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFBhcmFtcyA9IHBhcnNlTGlzdFBhcmFtcyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgLndhdGNoZXIod2F0Y2hQYXJhbXMubGlzdFBhcmFtcywgd2F0Y2hQYXJhbXMuZXh0cmFQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCh7IHR5cGUsIG9iamVjdCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdhdGNoRXZlbnQuQWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkZWRVaWQuaGFzKG9iamVjdC5tZXRhZGF0YS51aWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkZWRVaWQuYWRkKG9iamVjdC5tZXRhZGF0YS51aWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5EZWxldGVkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRVaWQuaGFzKG9iamVjdC5tZXRhZGF0YS51aWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFVpZC5hZGQob2JqZWN0Lm1ldGFkYXRhLnVpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTY2FuKChzdGF0ZSwgeyB0eXBlLCBvYmplY3QgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYXRjaEV2ZW50Lk1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IHN0YXRlLml0ZW1zLm1hcChpdGVtID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1ldGFkYXRhLnVpZCA9PT0gb2JqZWN0Lm1ldGFkYXRhLnVpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdhdGNoRXZlbnQuQWRkZWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdhdGNoRXZlbnQuRGVsZXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmV0Y2hlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUGFyYW1zLmxpc3RQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFBhcmFtcy5leHRyYVBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAobGlzdCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGxpc3QuaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXM6IGxpc3QubWV0YWRhdGEudG90YWxJdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gTkVWRVIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHNvdXJjZVN0YXRlKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzdGFydFdpdGgoc291cmNlU3RhdGUpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogb2Yoc291cmNlU3RhdGUpLFxuICAgICAgKSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRMaXN0Q29uZmlnPFIsIFA+IHtcbiAgcGFyYW1zOiBTaWduYWw8TGlzdEZldGNoUGFyYW1zPFA+PiB8IE9ic2VydmFibGU8TGlzdEZldGNoUGFyYW1zPFA+PjtcbiAgZmV0Y2hlcjogKFxuICAgIGxpc3RQYXJhbXM6IEZldGNoU2VlZCxcbiAgICBleHRyYVBhcmFtczogUCxcbiAgKSA9PiBPYnNlcnZhYmxlPEt1YmVybmV0ZXNSZXNvdXJjZUxpc3Q8Uj4+O1xuICB3YXRjaGVyPzogKFxuICAgIGxpc3RQYXJhbXM6IEZldGNoU2VlZCxcbiAgICBleHRyYVBhcmFtczogUCxcbiAgKSA9PiBPYnNlcnZhYmxlPFdhdGNoQVBJUmVzcG9uc2U8Uj4+O1xuICBwb2xsaW5nPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGZXRjaFBhcmFtczxQID0gbmV2ZXI+IHtcbiAgcGFnZUluZGV4PzogbnVtYmVyIHwgc3RyaW5nO1xuICBwYWdlU2l6ZT86IG51bWJlciB8IHN0cmluZztcbiAgc29ydEZpZWxkPzogc3RyaW5nO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAga2V5d29yZD86IHN0cmluZztcbiAgZmllbGRTZWxlY3Rvcj86IHN0cmluZztcbiAgbGFiZWxTZWxlY3Rvcj86IHN0cmluZztcbiAgZXh0cmE/OiBQO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoU2VlZCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBsaW1pdD86IHN0cmluZztcbiAgY29udGludWU/OiBzdHJpbmc7XG4gIGZpZWxkU2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2FkU3RhdGU8Uj4ge1xuICBpdGVtczogUltdO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGxvYWRpbmc6IGJvb2xlYW47XG4gIGxvYWRTdWNjZXNzOiBib29sZWFuO1xuICBsb2FkRXJyb3I/OiBIdHRwRXJyb3JSZXNwb25zZSB8IFN0YXR1cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQYWdlZExpc3RQYXJhbXM8UD4oXG4gIGRlZmF1bHRQYXJhbXM6IExpc3RGZXRjaFBhcmFtcyA9IHt9LFxuICBleHRyYVBhcmFtcz86IChxdWVyeVBhcmFtczogUGFyYW1zKSA9PiBQLFxuKTogUmVhZG9ubHk8e1xuICBzdHJlYW06ICgpID0+IE9ic2VydmFibGU8TGlzdEZldGNoUGFyYW1zPFA+PjtcbiAgc2lnbmFsOiAoKSA9PiBTaWduYWw8TGlzdEZldGNoUGFyYW1zPFA+Pjtcbn0+IHtcbiAgY29uc3Qgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBjb25zdCBwYXJhbXMkID0gcm91dGUucXVlcnlQYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+XG4gICAgICBub3JtYWxpemVQYXJhbXMoe1xuICAgICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICAgIHBhZ2VTaXplOiAyMCxcbiAgICAgICAgLi4uZGVmYXVsdFBhcmFtcyxcbiAgICAgICAgLi4uKHBhcmFtcy5wYWdlSW5kZXggPyB7IHBhZ2VJbmRleDogcGFyYW1zLnBhZ2VJbmRleCB9IDoge30pLFxuICAgICAgICAuLi4ocGFyYW1zLnBhZ2VTaXplID8geyBwYWdlU2l6ZTogcGFyYW1zLnBhZ2VTaXplIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXJhbXMua2V5d29yZCA/IHsga2V5d29yZDogcGFyYW1zLmtleXdvcmQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBhcmFtcy5zb3J0RmllbGQgPyB7IHNvcnRGaWVsZDogcGFyYW1zLnNvcnRGaWVsZCB9IDoge30pLFxuICAgICAgICAuLi4ocGFyYW1zLnNvcnRPcmRlciA/IHsgc29ydE9yZGVyOiBwYXJhbXMuc29ydE9yZGVyIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXJhbXMuZmllbGRTZWxlY3RvclxuICAgICAgICAgID8geyBmaWVsZFNlbGVjdG9yOiBwYXJhbXMuZmllbGRTZWxlY3RvciB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihwYXJhbXMubGFiZWxTZWxlY3RvclxuICAgICAgICAgID8geyBsYWJlbFNlbGVjdG9yOiBwYXJhbXMubGFiZWxTZWxlY3RvciB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihleHRyYVBhcmFtcyA/IHsgZXh0cmE6IGV4dHJhUGFyYW1zKHBhcmFtcykgfSA6IHt9KSxcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06ICgpID0+IHBhcmFtcyQsXG4gICAgc2lnbmFsOiAoKSA9PiB0b1NpZ25hbChwYXJhbXMkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5TGlzdFBhcmFtcygpIHtcbiAgY29uc3Qgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIGNvbnN0IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcblxuICByZXR1cm4gKHF1ZXJ5UGFyYW1zOiBQYXJhbXMpID0+IHtcbiAgICByb3V0ZXIubmF2aWdhdGUoWycuLyddLCB7XG4gICAgICByZWxhdGl2ZVRvOiByb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICBxdWVyeVBhcmFtczogbm9ybWFsaXplUGFyYW1zKHF1ZXJ5UGFyYW1zKSxcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXN0UGFyYW1zPFA+KHtcbiAgcGFnZUluZGV4LFxuICBwYWdlU2l6ZSxcbiAgc29ydEZpZWxkLFxuICBzb3J0T3JkZXIsXG4gIGtleXdvcmQsXG4gIGZpZWxkU2VsZWN0b3I6IG9yaWdpbkZpZWxkU2VsZWN0b3IsXG4gIGxhYmVsU2VsZWN0b3IsXG4gIGV4dHJhOiBleHRyYVBhcmFtcyxcbn06IExpc3RGZXRjaFBhcmFtczxQPikge1xuICBjb25zdCBzZWFyY2ggPSBrZXl3b3JkID8gYHNlYXJjaD0ke2tleXdvcmR9YCA6ICcnO1xuICBjb25zdCBzb3J0QnkgPSBzb3J0RmllbGRcbiAgICA/IGBzb3J0Ynk9JHtzb3J0T3JkZXIgPT09ICdkZXNjJyA/ICctJyA6ICcnfSR7c29ydEZpZWxkfWBcbiAgICA6ICcnO1xuICBjb25zdCBmaWVsZFNlbGVjdG9yID0gW3NlYXJjaCwgc29ydEJ5LCBvcmlnaW5GaWVsZFNlbGVjdG9yXVxuICAgIC5maWx0ZXIodiA9PiAhIXYpXG4gICAgLmpvaW4oJywnKTtcbiAgcmV0dXJuIHtcbiAgICBsaXN0UGFyYW1zOiB7XG4gICAgICBsaW1pdDogKHBhZ2VTaXplIHx8IDIwKSArICcnLFxuICAgICAgY29udGludWU6ICsocGFnZUluZGV4IHx8IDApICogKyhwYWdlU2l6ZSB8fCAyMCkgKyAnJyxcbiAgICAgIC4uLihsYWJlbFNlbGVjdG9yID8geyBsYWJlbFNlbGVjdG9yIH0gOiB7fSksXG4gICAgICAuLi4oZmllbGRTZWxlY3RvciA/IHsgZmllbGRTZWxlY3RvciB9IDoge30pLFxuICAgIH0gYXMgRmV0Y2hTZWVkLFxuICAgIGV4dHJhUGFyYW1zLFxuICB9O1xufVxuIl19