UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

269 lines 40.2 kB
/** * @packageDocumentation * @module common-layout */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core'; import { head, isEqual } from 'lodash-es'; import { BehaviorSubject, combineLatest, map, startWith, switchMap, take, tap, } from 'rxjs'; import { K8sUtilService, publishRef, } from '../../../../core/public-api'; import { BaseSelection } from '../project-select/base-selection'; import { CommonLayoutStoreService } from '../store.service'; import * as i0 from "@angular/core"; import * as i1 from "../store.service"; import * as i2 from "../../../../core/public-api"; const _c0 = (a0, a1, a2, a3, a4) => ({ group: a0, groups: a1, i: a2, j: a3, focusedMenuItemIndex: a4 }); function NamespaceSelectComponent_a_2_Template(rf, ctx) { if (rf & 1) { const _r1 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "a", 5); i0.ɵɵpipe(1, "translate"); i0.ɵɵlistener("auiDropdownVisibleChange", function NamespaceSelectComponent_a_2_Template_a_auiDropdownVisibleChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.handleMenuVisible($event)); }); i0.ɵɵelement(2, "aui-icon", 6); i0.ɵɵelementContainerStart(3); i0.ɵɵelementStart(4, "span"); i0.ɵɵtext(5); i0.ɵɵelementEnd(); i0.ɵɵelement(6, "aui-icon", 7); i0.ɵɵelementContainerEnd(); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); const menu_r3 = i0.ɵɵreference(5); i0.ɵɵpropertyInterpolate2("title", "", i0.ɵɵpipeBind1(1, 7, "namespace"), ": ", ctx_r1.selected == null ? null : ctx_r1.selected.name, ""); i0.ɵɵproperty("auiDropdown", menu_r3)("auiDropdownPosition", "bottom start")("auiDropdownClass", "acl-namespace-select__menu"); i0.ɵɵadvance(5); i0.ɵɵtextInterpolate(ctx_r1.selected ? ctx_r1.selected.name : "-"); } } function NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_aui_menu_item_4_span_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 18); i0.ɵɵtext(1); i0.ɵɵpipe(2, "aclDisplayName"); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r6 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" (", i0.ɵɵpipeBind1(2, 1, item_r6), ") "); } } function NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_aui_menu_item_4_Template(rf, ctx) { if (rf & 1) { const _r5 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "aui-menu-item", 16); i0.ɵɵpipe(1, "aclName"); i0.ɵɵpipe(2, "pure"); i0.ɵɵlistener("click", function NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_aui_menu_item_4_Template_aui_menu_item_click_0_listener() { const item_r6 = i0.ɵɵrestoreView(_r5).$implicit; const group_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onSelect(group_r7, item_r6)); }); i0.ɵɵelementStart(3, "span"); i0.ɵɵtext(4); i0.ɵɵpipe(5, "aclName"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(6, NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_aui_menu_item_4_span_6_Template, 3, 3, "span", 17); i0.ɵɵpipe(7, "aclDisplayName"); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r6 = ctx.$implicit; const j_r8 = ctx.index; const ctx_r8 = i0.ɵɵnextContext(2); const group_r7 = ctx_r8.$implicit; const i_r10 = ctx_r8.index; const groups_r11 = i0.ɵɵnextContext(2).ngIf; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵpropertyInterpolate("title", i0.ɵɵpipeBind1(1, 4, item_r6)); i0.ɵɵproperty("actived", i0.ɵɵpipeBind4(2, 6, item_r6, ctx_r1.isActive, ctx_r1.selected, i0.ɵɵpureFunction5(15, _c0, group_r7, groups_r11, i_r10, j_r8, ctx_r1.focusedMenuItemIndex))); i0.ɵɵadvance(4); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 11, item_r6)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(7, 13, item_r6)); } } function NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-menu-group")(1, "span", 14); i0.ɵɵtext(2); i0.ɵɵpipe(3, "aclDisplayName"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(4, NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_aui_menu_item_4_Template, 8, 21, "aui-menu-item", 15); i0.ɵɵelementEnd(); } if (rf & 2) { const group_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 3, group_r7.cluster)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngForOf", group_r7.namespaces)("ngForTrackBy", ctx_r1.trackFn); } } function NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_aui_menu_group_1_Template, 5, 5, "aui-menu-group", 10); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const group_r7 = ctx.$implicit; i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", group_r7.namespaces == null ? null : group_r7.namespaces.length); } } function NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 12); i0.ɵɵtemplate(1, NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_ng_container_1_Template, 2, 1, "ng-container", 13); i0.ɵɵelementEnd(); } if (rf & 2) { const groups_r11 = i0.ɵɵnextContext().ngIf; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", groups_r11)("ngForTrackBy", ctx_r1.groupTrackFn); } } function NamespaceSelectComponent_ng_template_4_ng_container_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, NamespaceSelectComponent_ng_template_4_ng_container_5_div_1_Template, 2, 2, "div", 11); i0.ɵɵpipe(2, "pure"); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const groups_r11 = ctx.ngIf; const ctx_r1 = i0.ɵɵnextContext(2); const noResult_r12 = i0.ɵɵreference(9); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(2, 2, groups_r11, ctx_r1.hasResult))("ngIfElse", noResult_r12); } } function NamespaceSelectComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) { const _r4 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "aui-menu")(1, "div", 8)(2, "aui-search", 9); i0.ɵɵpipe(3, "translate"); i0.ɵɵpipe(4, "async"); i0.ɵɵlistener("keywordChange", function NamespaceSelectComponent_ng_template_4_Template_aui_search_keywordChange_2_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.keyword$$.next($event)); }); i0.ɵɵelementEnd()(); i0.ɵɵtemplate(5, NamespaceSelectComponent_ng_template_4_ng_container_5_Template, 3, 5, "ng-container", 10); i0.ɵɵpipe(6, "async"); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 4, "filter_by_name"))("searchButton", false)("keyword", i0.ɵɵpipeBind1(4, 6, ctx_r1.keyword$$)); i0.ɵɵadvance(3); i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(6, 8, ctx_r1.groups$)); } } function NamespaceSelectComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "a", 19); i0.ɵɵelement(1, "aui-icon", 6); i0.ɵɵelementStart(2, "span"); i0.ɵɵtext(3); i0.ɵɵpipe(4, "translate"); i0.ɵɵelementEnd(); i0.ɵɵelement(5, "aui-icon", 20); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "no_namespace")); } } function NamespaceSelectComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 21); i0.ɵɵtext(1); i0.ɵɵpipe(2, "translate"); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "no_namespace"), " "); } } export class NamespaceSelectComponent extends BaseSelection { set projectName(projectName) { this.projectName$$.next(projectName); } constructor(store, k8sUtil, cdr) { super(cdr); this.store = store; this.k8sUtil = k8sUtil; this.projectName$$ = new BehaviorSubject(''); this.selectedChange = new EventEmitter(); this.availableGroups$ = this.projectName$$.pipe(switchMap(projectName => this.store.selectNamespacesByProjectName(projectName)), publishRef()); this.hasNamespace$ = this.availableGroups$.pipe(map(groups => head(groups .map(([cluster, namespaces]) => { const namespace = head(namespaces); if (!namespace) { return null; } return { cluster: this.name(cluster), name: this.name(namespace), }; }) .filter(item => !!item))), tap(first => { // TODO: temp fix for asm if (!this.selected && !first) { this.selectedChange.emit(null); } if (!this.selected && first) { this.selectedChange.emit(first); } }), map(first => !!first), publishRef()); this.groups$ = combineLatest([ this.keyword$$.pipe(startWith(''), tap(() => { this.focusedMenuItemIndex = -1; })), this.availableGroups$, ]).pipe(map(([keywords, groups]) => groups.map(([cluster, namespaces]) => ({ cluster, namespaces: (namespaces || []).filter(namespace => this.name(namespace).includes(keywords)), }))), publishRef()); this.name = (item) => this.k8sUtil.getName(item); this.isActive = (item, selected, { group: { cluster }, groups, i, j, focusedMenuItemIndex, }) => { if (!selected) { return false; } const isSelected = this.name(cluster) === selected.cluster && this.name(item) === selected.name; if (isSelected) { return isSelected; } return (focusedMenuItemIndex - groups.reduce((acc, curr, index) => index >= i ? acc : curr.namespaces.length + acc, 0) === j); }; this.trackFn = (_, item) => this.name(item); this.groupTrackFn = (_, { cluster, }) => this.name(cluster); } hasResult(groups) { return groups.some(group => !!group.namespaces.length); } onSelect({ cluster }, namespace) { if (isEqual(this.selected, { cluster: this.name(cluster), namespace: this.name(namespace), })) { return; } this.selectedChange.emit({ cluster: this.name(cluster), name: this.name(namespace), }); } selectByIndex(index) { this.groups$.pipe(take(1)).subscribe(groups => { for (const [i, group] of groups.entries()) { const namespaces = group.namespaces; index = index - i; if (index < namespaces.length) { this.onSelect(group, namespaces[index]); break; } } }); } static { this.ɵfac = function NamespaceSelectComponent_Factory(t) { return new (t || NamespaceSelectComponent)(i0.ɵɵdirectiveInject(i1.CommonLayoutStoreService), i0.ɵɵdirectiveInject(i2.K8sUtilService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NamespaceSelectComponent, selectors: [["acl-namespace-select"]], inputs: { projectName: "projectName", selected: "selected" }, outputs: { selectedChange: "selectedChange" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 8, consts: [["menu", ""], ["empty", ""], ["noResult", ""], [1, "acl-namespace-select"], ["href", "javascript:;", "auiDropdownActive", "acl-namespace-select--active", 3, "auiDropdown", "auiDropdownPosition", "auiDropdownClass", "title", "auiDropdownVisibleChange", 4, "ngIf", "ngIfElse"], ["href", "javascript:;", "auiDropdownActive", "acl-namespace-select--active", 3, "auiDropdownVisibleChange", "auiDropdown", "auiDropdownPosition", "auiDropdownClass", "title"], ["icon", "prod:namespace", "size", "16px", "color", "#fff"], ["icon", "caret_down_s", "size", "16px"], [1, "acl-namespace-select__input"], [3, "keywordChange", "placeholder", "searchButton", "keyword"], [4, "ngIf"], ["class", "acl-namespace-select__options", 4, "ngIf", "ngIfElse"], [1, "acl-namespace-select__options"], [4, "ngFor", "ngForOf", "ngForTrackBy"], ["auiMenuGroupTitle", ""], [3, "actived", "title", "click", 4, "ngFor", "ngForOf", "ngForTrackBy"], [3, "click", "actived", "title"], ["class", "acl-namespace-select__display-name", 4, "ngIf"], [1, "acl-namespace-select__display-name"], ["href", "javascript:;"], ["icon", "caret_down_s", "size", "16px", "color", "#999"], [1, "acl-namespace-select__no-result"]], template: function NamespaceSelectComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 3); i0.ɵɵpipe(1, "async"); i0.ɵɵtemplate(2, NamespaceSelectComponent_a_2_Template, 7, 9, "a", 4); i0.ɵɵpipe(3, "async"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(4, NamespaceSelectComponent_ng_template_4_Template, 7, 10, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(6, NamespaceSelectComponent_ng_template_6_Template, 6, 3, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor)(8, NamespaceSelectComponent_ng_template_8_Template, 3, 3, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { const empty_r13 = i0.ɵɵreference(7); i0.ɵɵclassProp("disabled", !i0.ɵɵpipeBind1(1, 4, ctx.hasNamespace$)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(3, 6, ctx.hasNamespace$))("ngIfElse", empty_r13); } }, styles: [":host{display:block}.acl-namespace-select{padding:4px 8px;display:flex}.acl-namespace-select.disabled{position:relative}.acl-namespace-select.disabled:before{content:\"\";position:absolute;top:0;right:0;bottom:0;left:0}.acl-namespace-select>a{flex:1;display:flex;border-radius:2px;flex-direction:row;align-items:center;justify-content:flex-start;height:36px;padding:0 8px;width:100%;color:rgb(var(--aui-color-n-10));text-decoration:none}.acl-namespace-select>a:hover{background-color:#fff3}.acl-namespace-select>a>span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 8px}.acl-namespace-select>a aui-icon{height:16px}.acl-namespace-select--active{background-color:#fff3}.acl-namespace-select__menu .aui-menu{max-width:320px;max-height:400px;display:flex;flex-direction:column}.acl-namespace-select__input{flex-shrink:0;padding-bottom:8px}.acl-namespace-select__options{flex:1;overflow:auto}.acl-namespace-select__options::-webkit-scrollbar{width:8px;height:4px}.acl-namespace-select__options::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgb(var(--aui-color-n-7))}.acl-namespace-select__options::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--aui-color-n-5))}.acl-namespace-select__options::-webkit-scrollbar-corner{background-color:transparent}.acl-namespace-select__display-name{color:rgb(var(--aui-color-n-4));margin-left:4px}.acl-namespace-select__no-result{border-top:solid 1px rgb(var(--aui-color-n-8));line-height:28px;padding:8px 0 0;margin:0 -8px;display:flex;align-items:center;justify-content:center;color:rgb(var(--aui-color-n-6))}\n"], encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceSelectComponent, [{ type: Component, args: [{ selector: 'acl-namespace-select', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"acl-namespace-select\"\n [class.disabled]=\"!(hasNamespace$ | async)\"\n>\n <a\n *ngIf=\"hasNamespace$ | async; else empty\"\n href=\"javascript:;\"\n [auiDropdown]=\"menu\"\n [auiDropdownPosition]=\"'bottom start'\"\n [auiDropdownClass]=\"'acl-namespace-select__menu'\"\n auiDropdownActive=\"acl-namespace-select--active\"\n (auiDropdownVisibleChange)=\"handleMenuVisible($event)\"\n title=\"{{ 'namespace' | translate }}: {{ selected?.name }}\"\n >\n <aui-icon\n icon=\"prod:namespace\"\n size=\"16px\"\n color=\"#fff\"\n ></aui-icon>\n <ng-container>\n <span>{{ selected ? selected.name : '-' }}</span>\n <aui-icon\n icon=\"caret_down_s\"\n size=\"16px\"\n ></aui-icon>\n </ng-container>\n </a>\n</div>\n\n<ng-template #menu\n ><aui-menu\n ><div class=\"acl-namespace-select__input\">\n <aui-search\n [placeholder]=\"'filter_by_name' | translate\"\n [searchButton]=\"false\"\n [keyword]=\"keyword$$ | async\"\n (keywordChange)=\"keyword$$.next($event)\"\n ></aui-search>\n </div>\n <ng-container *ngIf=\"groups$ | async as groups\">\n <div\n class=\"acl-namespace-select__options\"\n *ngIf=\"groups | pure: hasResult; else noResult\"\n >\n <ng-container\n *ngFor=\"let group of groups; index as i; trackBy: groupTrackFn\"\n >\n <aui-menu-group *ngIf=\"group.namespaces?.length\">\n <span auiMenuGroupTitle>{{ group.cluster | aclDisplayName }}</span>\n <aui-menu-item\n *ngFor=\"\n let item of group.namespaces;\n index as j;\n trackBy: trackFn\n \"\n [actived]=\"\n item\n | pure\n : isActive\n : selected\n : {\n group: group,\n groups: groups,\n i: i,\n j: j,\n focusedMenuItemIndex: focusedMenuItemIndex\n }\n \"\n (click)=\"onSelect(group, item)\"\n title=\"{{ item | aclName }}\"\n >\n <span>{{ item | aclName }}</span>\n <span\n *ngIf=\"item | aclDisplayName\"\n class=\"acl-namespace-select__display-name\"\n >\n ({{ item | aclDisplayName }})\n </span>\n </aui-menu-item>\n </aui-menu-group>\n </ng-container>\n </div>\n </ng-container>\n </aui-menu></ng-template\n>\n\n<ng-template #empty>\n <a href=\"javascript:;\">\n <aui-icon\n icon=\"prod:namespace\"\n size=\"16px\"\n color=\"#fff\"\n ></aui-icon>\n <span>{{ 'no_namespace' | translate }}</span>\n <aui-icon\n icon=\"caret_down_s\"\n size=\"16px\"\n color=\"#999\"\n ></aui-icon>\n </a>\n</ng-template>\n\n<ng-template #noResult>\n <div class=\"acl-namespace-select__no-result\">\n {{ 'no_namespace' | translate }}\n </div>\n</ng-template>\n", styles: [":host{display:block}.acl-namespace-select{padding:4px 8px;display:flex}.acl-namespace-select.disabled{position:relative}.acl-namespace-select.disabled:before{content:\"\";position:absolute;top:0;right:0;bottom:0;left:0}.acl-namespace-select>a{flex:1;display:flex;border-radius:2px;flex-direction:row;align-items:center;justify-content:flex-start;height:36px;padding:0 8px;width:100%;color:rgb(var(--aui-color-n-10));text-decoration:none}.acl-namespace-select>a:hover{background-color:#fff3}.acl-namespace-select>a>span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 8px}.acl-namespace-select>a aui-icon{height:16px}.acl-namespace-select--active{background-color:#fff3}.acl-namespace-select__menu .aui-menu{max-width:320px;max-height:400px;display:flex;flex-direction:column}.acl-namespace-select__input{flex-shrink:0;padding-bottom:8px}.acl-namespace-select__options{flex:1;overflow:auto}.acl-namespace-select__options::-webkit-scrollbar{width:8px;height:4px}.acl-namespace-select__options::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgb(var(--aui-color-n-7))}.acl-namespace-select__options::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--aui-color-n-5))}.acl-namespace-select__options::-webkit-scrollbar-corner{background-color:transparent}.acl-namespace-select__display-name{color:rgb(var(--aui-color-n-4));margin-left:4px}.acl-namespace-select__no-result{border-top:solid 1px rgb(var(--aui-color-n-8));line-height:28px;padding:8px 0 0;margin:0 -8px;display:flex;align-items:center;justify-content:center;color:rgb(var(--aui-color-n-6))}\n"] }] }], () => [{ type: i1.CommonLayoutStoreService }, { type: i2.K8sUtilService }, { type: i0.ChangeDetectorRef }], { projectName: [{ type: Input }], selected: [{ type: Input }], selectedChange: [{ type: Output }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NamespaceSelectComponent, { className: "NamespaceSelectComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3BhZ2Utc2NhZmZvbGQvcGFnZS1oZWFkZXIvY29tbW9uLWxheW91dC9uYW1lc3BhY2Utc2VsZWN0L2NvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9wYWdlLXNjYWZmb2xkL3BhZ2UtaGVhZGVyL2NvbW1vbi1sYXlvdXQvbmFtZXNwYWNlLXNlbGVjdC9jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLEdBQUcsRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBRUwsY0FBYyxFQUNkLFVBQVUsR0FDWCxNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQVMsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7OztJQzNCakUsNEJBU0M7O0lBRkMseU5BQTRCLGdDQUF5QixLQUFDO0lBR3RELDhCQUlZO0lBQ1osNkJBQWM7SUFDWiw0QkFBTTtJQUFBLFlBQW9DO0lBQUEsaUJBQU87SUFDakQsOEJBR1k7O0lBRWhCLGlCQUFJOzs7O0lBZEYsMElBQTJEO0lBSDNELEFBREEsQUFEQSxxQ0FBb0IsdUNBQ2tCLGtEQUNX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Q0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7eUZBbktVLHdCQUF3QjtvRUFBeEIsd0JBQXdCO1lDeENyQyw4QkFHQzs7WUFDQyxxRUFTQzs7WUFjSCxpQkFBTTtZQTJFTixBQWhCQSxBQXpEQSwySEFDRyw2R0F3RGlCLDZHQWdCRzs7O1lBcEdyQixvRUFBMkM7WUFHeEMsZUFBNkI7WUFBQSxBQUE3Qiw4REFBNkIsdUJBQVU7OztpRkRtQy9CLHdCQUF3QjtjQVBwQyxTQUFTOzJCQUNFLHNCQUFzQixtQkFHZix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJO3NIQU1qQyxXQUFXO2tCQURkLEtBQUs7WUFLRyxRQUFRO2tCQUFoQixLQUFLO1lBRUksY0FBYztrQkFBdkIsTUFBTTs7a0ZBVkksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgY29tbW9uLWxheW91dFxuICovXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBoZWFkLCBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBLOHNVdGlsU2VydmljZSxcbiAgcHVibGlzaFJlZixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IE5hbWVzcGFjZUlkZW50aXR5IH0gZnJvbSAnLi4vY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VTZWxlY3Rpb24gfSBmcm9tICcuLi9wcm9qZWN0LXNlbGVjdC9iYXNlLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBDb21tb25MYXlvdXRTdG9yZVNlcnZpY2UsIEdyb3VwIH0gZnJvbSAnLi4vc3RvcmUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1uYW1lc3BhY2Utc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZVNlbGVjdENvbXBvbmVudCBleHRlbmRzIEJhc2VTZWxlY3Rpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcblxuICBASW5wdXQoKVxuICBzZXQgcHJvamVjdE5hbWUocHJvamVjdE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdE5hbWUkJC5uZXh0KHByb2plY3ROYW1lKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNlbGVjdGVkPzogTmFtZXNwYWNlSWRlbnRpdHk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOYW1lc3BhY2VJZGVudGl0eSB8IG51bGw+KCk7XG5cbiAgYXZhaWxhYmxlR3JvdXBzJCA9IHRoaXMucHJvamVjdE5hbWUkJC5waXBlKFxuICAgIHN3aXRjaE1hcChwcm9qZWN0TmFtZSA9PlxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3ROYW1lc3BhY2VzQnlQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSksXG4gICAgKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgaGFzTmFtZXNwYWNlJCA9IHRoaXMuYXZhaWxhYmxlR3JvdXBzJC5waXBlKFxuICAgIG1hcChncm91cHMgPT5cbiAgICAgIGhlYWQoXG4gICAgICAgIGdyb3Vwc1xuICAgICAgICAgIC5tYXAoKFtjbHVzdGVyLCBuYW1lc3BhY2VzXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gaGVhZChuYW1lc3BhY2VzKTtcblxuICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNsdXN0ZXI6IHRoaXMubmFtZShjbHVzdGVyKSxcbiAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lKG5hbWVzcGFjZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+ICEhaXRlbSksXG4gICAgICApLFxuICAgICksXG4gICAgdGFwKGZpcnN0ID0+IHtcbiAgICAgIC8vIFRPRE86IHRlbXAgZml4IGZvciBhc21cbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZCAmJiAhZmlyc3QpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgJiYgZmlyc3QpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGZpcnN0KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBtYXAoZmlyc3QgPT4gISFmaXJzdCksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGdyb3VwcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmtleXdvcmQkJC5waXBlKFxuICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNlZE1lbnVJdGVtSW5kZXggPSAtMTtcbiAgICAgIH0pLFxuICAgICksXG4gICAgdGhpcy5hdmFpbGFibGVHcm91cHMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2tleXdvcmRzLCBncm91cHNdKSA9PlxuICAgICAgZ3JvdXBzLm1hcCgoW2NsdXN0ZXIsIG5hbWVzcGFjZXNdKSA9PiAoe1xuICAgICAgICBjbHVzdGVyLFxuICAgICAgICBuYW1lc3BhY2VzOiAobmFtZXNwYWNlcyB8fCBbXSkuZmlsdGVyKG5hbWVzcGFjZSA9PlxuICAgICAgICAgIHRoaXMubmFtZShuYW1lc3BhY2UpLmluY2x1ZGVzKGtleXdvcmRzKSxcbiAgICAgICAgKSxcbiAgICAgIH0pKSxcbiAgICApLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBDb21tb25MYXlvdXRTdG9yZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNVdGlsOiBLOHNVdGlsU2VydmljZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBzdXBlcihjZHIpO1xuICB9XG5cbiAgbmFtZSA9IChpdGVtOiBLdWJlcm5ldGVzUmVzb3VyY2UpID0+IHRoaXMuazhzVXRpbC5nZXROYW1lKGl0ZW0pO1xuXG4gIGlzQWN0aXZlID0gKFxuICAgIGl0ZW06IEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgICBzZWxlY3RlZDogTmFtZXNwYWNlSWRlbnRpdHksXG4gICAge1xuICAgICAgZ3JvdXA6IHsgY2x1c3RlciB9LFxuICAgICAgZ3JvdXBzLFxuICAgICAgaSxcbiAgICAgIGosXG4gICAgICBmb2N1c2VkTWVudUl0ZW1JbmRleCxcbiAgICB9OiB7XG4gICAgICBncm91cDogeyBjbHVzdGVyOiBLdWJlcm5ldGVzUmVzb3VyY2UgfTtcbiAgICAgIGdyb3VwczogQXJyYXk8eyBuYW1lc3BhY2VzOiB1bmtub3duW10gfT47XG4gICAgICBpOiBudW1iZXI7XG4gICAgICBqOiBudW1iZXI7XG4gICAgICBmb2N1c2VkTWVudUl0ZW1JbmRleDogbnVtYmVyO1xuICAgIH0sXG4gICkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICB0aGlzLm5hbWUoY2x1c3RlcikgPT09IHNlbGVjdGVkLmNsdXN0ZXIgJiZcbiAgICAgIHRoaXMubmFtZShpdGVtKSA9PT0gc2VsZWN0ZWQubmFtZTtcbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGZvY3VzZWRNZW51SXRlbUluZGV4IC1cbiAgICAgICAgZ3JvdXBzLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjdXJyLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGluZGV4ID49IGkgPyBhY2MgOiBjdXJyLm5hbWVzcGFjZXMubGVuZ3RoICsgYWNjLFxuICAgICAgICAgIDAsXG4gICAgICAgICkgPT09XG4gICAgICBqXG4gICAgKTtcbiAgfTtcblxuICB0cmFja0ZuID0gKF86IG51bWJlciwgaXRlbTogS3ViZXJuZXRlc1Jlc291cmNlKSA9PiB0aGlzLm5hbWUoaXRlbSk7XG5cbiAgZ3JvdXBUcmFja0ZuID0gKFxuICAgIF86IG51bWJlcixcbiAgICB7XG4gICAgICBjbHVzdGVyLFxuICAgIH06IHsgY2x1c3RlcjogS3ViZXJuZXRlc1Jlc291cmNlOyBuYW1lc3BhY2VzOiBLdWJlcm5ldGVzUmVzb3VyY2VbXSB9LFxuICApID0+IHRoaXMubmFtZShjbHVzdGVyKTtcblxuICBoYXNSZXN1bHQoZ3JvdXBzOiBHcm91cFtdKSB7XG4gICAgcmV0dXJuIGdyb3Vwcy5zb21lKGdyb3VwID0+ICEhZ3JvdXAubmFtZXNwYWNlcy5sZW5ndGgpO1xuICB9XG5cbiAgb25TZWxlY3QoXG4gICAgeyBjbHVzdGVyIH06IHsgY2x1c3RlcjogS3ViZXJuZXRlc1Jlc291cmNlIH0sXG4gICAgbmFtZXNwYWNlOiBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gICkge1xuICAgIGlmIChcbiAgICAgIGlzRXF1YWwodGhpcy5zZWxlY3RlZCwge1xuICAgICAgICBjbHVzdGVyOiB0aGlzLm5hbWUoY2x1c3RlciksXG4gICAgICAgIG5hbWVzcGFjZTogdGhpcy5uYW1lKG5hbWVzcGFjZSksXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh7XG4gICAgICBjbHVzdGVyOiB0aGlzLm5hbWUoY2x1c3RlciksXG4gICAgICBuYW1lOiB0aGlzLm5hbWUobmFtZXNwYWNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdEJ5SW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZ3JvdXBzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShncm91cHMgPT4ge1xuICAgICAgZm9yIChjb25zdCBbaSwgZ3JvdXBdIG9mIGdyb3Vwcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlcyA9IGdyb3VwLm5hbWVzcGFjZXM7XG4gICAgICAgIGluZGV4ID0gaW5kZXggLSBpO1xuICAgICAgICBpZiAoaW5kZXggPCBuYW1lc3BhY2VzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMub25TZWxlY3QoZ3JvdXAsIG5hbWVzcGFjZXNbaW5kZXhdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiYWNsLW5hbWVzcGFjZS1zZWxlY3RcIlxuICBbY2xhc3MuZGlzYWJsZWRdPVwiIShoYXNOYW1lc3BhY2UkIHwgYXN5bmMpXCJcbj5cbiAgPGFcbiAgICAqbmdJZj1cImhhc05hbWVzcGFjZSQgfCBhc3luYzsgZWxzZSBlbXB0eVwiXG4gICAgaHJlZj1cImphdmFzY3JpcHQ6O1wiXG4gICAgW2F1aURyb3Bkb3duXT1cIm1lbnVcIlxuICAgIFthdWlEcm9wZG93blBvc2l0aW9uXT1cIidib3R0b20gc3RhcnQnXCJcbiAgICBbYXVpRHJvcGRvd25DbGFzc109XCInYWNsLW5hbWVzcGFjZS1zZWxlY3RfX21lbnUnXCJcbiAgICBhdWlEcm9wZG93bkFjdGl2ZT1cImFjbC1uYW1lc3BhY2Utc2VsZWN0LS1hY3RpdmVcIlxuICAgIChhdWlEcm9wZG93blZpc2libGVDaGFuZ2UpPVwiaGFuZGxlTWVudVZpc2libGUoJGV2ZW50KVwiXG4gICAgdGl0bGU9XCJ7eyAnbmFtZXNwYWNlJyB8IHRyYW5zbGF0ZSB9fToge3sgc2VsZWN0ZWQ/Lm5hbWUgfX1cIlxuICA+XG4gICAgPGF1aS1pY29uXG4gICAgICBpY29uPVwicHJvZDpuYW1lc3BhY2VcIlxuICAgICAgc2l6ZT1cIjE2cHhcIlxuICAgICAgY29sb3I9XCIjZmZmXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgICA8bmctY29udGFpbmVyPlxuICAgICAgPHNwYW4+e3sgc2VsZWN0ZWQgPyBzZWxlY3RlZC5uYW1lIDogJy0nIH19PC9zcGFuPlxuICAgICAgPGF1aS1pY29uXG4gICAgICAgIGljb249XCJjYXJldF9kb3duX3NcIlxuICAgICAgICBzaXplPVwiMTZweFwiXG4gICAgICA+PC9hdWktaWNvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9hPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbWVudVxuICA+PGF1aS1tZW51XG4gICAgPjxkaXYgY2xhc3M9XCJhY2wtbmFtZXNwYWNlLXNlbGVjdF9faW5wdXRcIj5cbiAgICAgIDxhdWktc2VhcmNoXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCInZmlsdGVyX2J5X25hbWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3NlYXJjaEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgIFtrZXl3b3JkXT1cImtleXdvcmQkJCB8IGFzeW5jXCJcbiAgICAgICAgKGtleXdvcmRDaGFuZ2UpPVwia2V5d29yZCQkLm5leHQoJGV2ZW50KVwiXG4gICAgICA+PC9hdWktc2VhcmNoPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cHMkIHwgYXN5bmMgYXMgZ3JvdXBzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYWNsLW5hbWVzcGFjZS1zZWxlY3RfX29wdGlvbnNcIlxuICAgICAgICAqbmdJZj1cImdyb3VwcyB8IHB1cmU6IGhhc1Jlc3VsdDsgZWxzZSBub1Jlc3VsdFwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzOyBpbmRleCBhcyBpOyB0cmFja0J5OiBncm91cFRyYWNrRm5cIlxuICAgICAgICA+XG4gICAgICAgICAgPGF1aS1tZW51LWdyb3VwICpuZ0lmPVwiZ3JvdXAubmFtZXNwYWNlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8c3BhbiBhdWlNZW51R3JvdXBUaXRsZT57eyBncm91cC5jbHVzdGVyIHwgYWNsRGlzcGxheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8YXVpLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSBvZiBncm91cC5uYW1lc3BhY2VzO1xuICAgICAgICAgICAgICAgIGluZGV4IGFzIGo7XG4gICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tGblxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbYWN0aXZlZF09XCJcbiAgICAgICAgICAgICAgICBpdGVtXG4gICAgICAgICAgICAgICAgICB8IHB1cmVcbiAgICAgICAgICAgICAgICAgICAgOiBpc0FjdGl2ZVxuICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzOiBncm91cHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpOiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgajogaixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWRNZW51SXRlbUluZGV4OiBmb2N1c2VkTWVudUl0ZW1JbmRleFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0KGdyb3VwLCBpdGVtKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgaXRlbSB8IGFjbE5hbWUgfX1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtIHwgYWNsTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0gfCBhY2xEaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY2wtbmFtZXNwYWNlLXNlbGVjdF9fZGlzcGxheS1uYW1lXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICh7eyBpdGVtIHwgYWNsRGlzcGxheU5hbWUgfX0pXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYXVpLW1lbnUtaXRlbT5cbiAgICAgICAgICA8L2F1aS1tZW51LWdyb3VwPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2F1aS1tZW51PjwvbmctdGVtcGxhdGVcbj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiPlxuICAgIDxhdWktaWNvblxuICAgICAgaWNvbj1cInByb2Q6bmFtZXNwYWNlXCJcbiAgICAgIHNpemU9XCIxNnB4XCJcbiAgICAgIGNvbG9yPVwiI2ZmZlwiXG4gICAgPjwvYXVpLWljb24+XG4gICAgPHNwYW4+e3sgJ25vX25hbWVzcGFjZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPGF1aS1pY29uXG4gICAgICBpY29uPVwiY2FyZXRfZG93bl9zXCJcbiAgICAgIHNpemU9XCIxNnB4XCJcbiAgICAgIGNvbG9yPVwiIzk5OVwiXG4gICAgPjwvYXVpLWljb24+XG4gIDwvYT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm9SZXN1bHQ+XG4gIDxkaXYgY2xhc3M9XCJhY2wtbmFtZXNwYWNlLXNlbGVjdF9fbm8tcmVzdWx0XCI+XG4gICAge3sgJ25vX25hbWVzcGFjZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19