UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

178 lines 32.3 kB
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