simpo-component-library 3.7.3 → 3.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +3 -3
- package/fesm2022/simpo-component-library.mjs +2 -2
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/components/input-fields/input-fields.component.d.ts +1 -1
- package/lib/ecommerce/sections/authentication-required/authentication-required.component.d.ts +1 -1
- package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +1 -1
- package/lib/ecommerce/sections/schemes/schemes.component.d.ts +1 -1
- package/lib/sections/banner-carousel/banner-carousel.component.d.ts +1 -1
- package/lib/sections/pricing-section/pricing-section.component.d.ts +1 -1
- package/package.json +1 -1
- package/simpo-component-library-3.7.004.tgz +0 -0
- package/simpo-component-library-3.7.003.tgz +0 -0
|
@@ -1269,7 +1269,7 @@ export class ProductListComponent extends BaseSection {
|
|
|
1269
1269
|
return brightness > threshold ? '#000000' : '#ffffff';
|
|
1270
1270
|
}
|
|
1271
1271
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.RestService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.StorageServiceService }, { token: i5.MatBottomSheet }, { token: i6.MatDialog }, { token: i7.CartService }, { token: i8.MessageService }, { token: i0.Renderer2 }, { token: i9.AnalyticsService }, { token: i10.BookingProductCartService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1272
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductListComponent, isStandalone: true, selector: "simpo-product-list", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window:resize": "getScreenSize()", "window:scroll": "onWindowScroll($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "listScrollContainer", first: true, predicate: ["listScrollContainer"], descendants: true }, { propertyName: "filterScroll", first: true, predicate: ["filterScroll"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\r\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\r\n</div> -->\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\r\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\r\n [spacingHorizontal]=\"stylesLayout\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\"\r\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\r\n </div> -->\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\r\n CLEAR ALL\r\n </div>\r\n </div>\r\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\r\n style=\"width: 77.5%; margin-right: 1%;\">\r\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\">\r\n <ng-container *ngFor=\"let filter of displayChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\r\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\r\n </select>\r\n </div> -->\r\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\r\n <span class=\"sort-label\">Sort By:</span>\r\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\r\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">▾</span> <!-- Down arrow, rotates open -->\r\n\r\n <div class=\"options\" *ngIf=\"isOpen\">\r\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\r\n (click)=\"selectOption(filter, $event)\">\r\n {{ filter.name }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isMobile\" class=\"d-flex w-100 onlyMobile gap-15 flex-wrap\">\r\n <ng-container *ngFor=\"let filter of displayChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"main-product-section\">\r\n <div class=\"filter-side\">\r\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\r\n </div>\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\r\n #listScrollContainer>\r\n <ng-container *ngIf=\"!apiLoading\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\r\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\r\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\r\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\r\n [index]=\"i\"></simpo-small-product-listing>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n </div>\r\n\r\n <div class=\"bottom-filter\">\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Sort by</span>\r\n </div>\r\n <div class=\"divider\"></div>\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span>Filter</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\r\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\r\n\r\n<ng-template #FavouriteTags let-product=\"data\">\r\n <div class=\"fav-icon-wrapper\">\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\r\n </mat-icon>\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\r\n </mat-icon>\r\n <span class=\"fav-tooltip\">\r\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #Tags let-product=\"data\">\r\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\r\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\r\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\r\n {{ tag }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #FilterSection>\r\n <section>\r\n <!-- Server-driven filters from query-options (Brand, Categories, Collections, Specifications, ...).\r\n Empty for unseeded businesses, in which case the legacy blocks below are the sidebar. -->\r\n <div class=\"categories-section\" *ngFor=\"let group of customFilterGroups\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"customGroupCollapsed[group.key] = !customGroupCollapsed[group.key]\" style=\"cursor:pointer\">\r\n <h6><b>{{ group.label }}</b></h6>\r\n <mat-icon>{{ customGroupCollapsed[group.key] ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!customGroupCollapsed[group.key]\">\r\n <ng-container *ngFor=\"let filter of group.filters\">\r\n <div *ngIf=\"group.filters.length > 1\" class=\"trim-text\" style=\"font-weight: 600; margin-top: 8px;\">\r\n {{ filter.label }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"filter.control === 'RANGE'; else customChoices\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-top: 6px;\">\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Min ' + (filter.min ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).min\"\r\n (change)=\"setCustomRange(filter.identifier, 'min', $any($event.target).value)\" />\r\n <span>-</span>\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Max ' + (filter.max ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).max\"\r\n (change)=\"setCustomRange(filter.identifier, 'max', $any($event.target).value)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #customChoices>\r\n <ng-container *ngIf=\"filter.control === 'BOOLEAN' && !filter.choices?.length; else choiceList\">\r\n <label class=\"category-options\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, 'true')\"\r\n (change)=\"toggleCustomChoice(filter, 'true')\" />\r\n <div class=\"trim-text\">Yes</div>\r\n </label>\r\n </ng-container>\r\n <ng-template #choiceList>\r\n <label class=\"category-options\" *ngFor=\"let choice of filter.choices\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, choice.value)\"\r\n (change)=\"toggleCustomChoice(filter, choice.value)\" />\r\n <div class=\"trim-text\">{{ choice.label }} <span *ngIf=\"choice.count !== undefined\">({{ choice.count }})</span></div>\r\n </label>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- No legacy Categories block: categories are shown only when query-options returns them. -->\r\n\r\n <div class=\"categories-section\" *ngIf=\"collections?.length && !isApiFilter('collection')\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"collectionsCollapsed = !collectionsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Collections</b></h6>\r\n <mat-icon>{{ collectionsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!collectionsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let collection of displayedCollections\"\r\n (click)=\"applyFilter(collection, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"collection.status\" />\r\n <div class=\"trim-text\">{{collection.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"collections.length > 4\" class=\"toggle-categories\" (click)=\"toggleCollections()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllCollections ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllCollections\"><mat-icon>expand_more</mat-icon></ng-container>\r\n <ng-container *ngIf=\"showAllCollections\"><mat-icon>expand_less</mat-icon></ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"(brands?.length ?? 0) > 1 && !isApiFilter('brand')\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"brandsCollapsed = !brandsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Brand</b></h6>\r\n <mat-icon>{{ brandsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!brandsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let brand of displayedBrands\"\r\n (click)=\"applyFilter(brand, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"brand.status\" />\r\n <div class=\"trim-text\">{{brand.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"brands.length > 4\" class=\"toggle-categories\" (click)=\"toggleBrands()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllBrands ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllBrands\"><mat-icon>expand_more</mat-icon></ng-container>\r\n <ng-container *ngIf=\"showAllBrands\"><mat-icon>expand_less</mat-icon></ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Product Type</b></h6>\r\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!productTypeCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop for</b></h6>\r\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!shopForCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Material</b></h6>\r\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!materialCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Metal</b></h6>\r\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!metalCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ring Style</b></h6>\r\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ringStyleCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Ratings and price stay at the bottom, below the server-driven filters. -->\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ratings</b></h6>\r\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ratingsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"rating.selected\" />\r\n <div class=\"trim-text\">{{ rating.label }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by price</b></h6>\r\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!priceCollapsed\">\r\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\r\n <div class=\"trim-text\">{{ range.label }}</div>\r\n </label>\r\n </ng-container>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SortingSection>\r\n <section style=\"padding: 10px\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\r\n <span>Sort by</span>\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\r\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\r\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\r\n </mat-radio-group>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\r\n <ng-template #theme1style1>\r\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\r\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\r\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div class=\"mt-2 w-100\">\r\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\r\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\r\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\r\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\r\n (click)=\"selectVarient(product, varient)\">\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\r\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\r\n <div class=\"fs-16\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n\r\n <div class=\"fs-16 text-start\">\r\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\r\n {{product?.price?.value | number:'1.0-0'}}\r\n </span>\r\n </div>\r\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\r\n <span [innerHTML]='currency'></span>\r\n {{product.price.sellingPrice | number:'1.0-0'}}\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"product-name heading-large w-100 text-left trim-text\"\r\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n\r\n <div class=\"material-info\"\r\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\r\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\r\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\r\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-8 d-flex flex-column gap-3\">\r\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n <div class=\"fs-16 text-start\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n <div class=\"d-flex w-45\">\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn w-100\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section w-100\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-4 h-100 position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n</ng-template>\r\n\r\n\r\n\r\n", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "pipe", type: i11.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.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: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i13.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i14.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i15.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i16.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i17.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: CardSkeletonLoaderComponent, selector: "simpo-card-skeleton-loader", inputs: ["count", "showTitles"] }, { kind: "component", type: SmallProductListingComponent, selector: "simpo-small-product-listing", inputs: ["product", "data", "isScrollable", "isCategoryProductList", "customClass", "index"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }] }); }
|
|
1272
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductListComponent, isStandalone: true, selector: "simpo-product-list", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window:resize": "getScreenSize()", "window:scroll": "onWindowScroll($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "listScrollContainer", first: true, predicate: ["listScrollContainer"], descendants: true }, { propertyName: "filterScroll", first: true, predicate: ["filterScroll"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\r\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\r\n</div> -->\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\r\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\r\n [spacingHorizontal]=\"stylesLayout\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\"\r\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\r\n </div> -->\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\r\n CLEAR ALL\r\n </div>\r\n </div>\r\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\r\n style=\"width: 77.5%; margin-right: 1%;\">\r\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\"></div>\r\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\r\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\r\n </select>\r\n </div> -->\r\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\r\n <span class=\"sort-label\">Sort By:</span>\r\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\r\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">▾</span> <!-- Down arrow, rotates open -->\r\n\r\n <div class=\"options\" *ngIf=\"isOpen\">\r\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\r\n (click)=\"selectOption(filter, $event)\">\r\n {{ filter.name }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"main-product-section\">\r\n <div class=\"filter-side\">\r\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\r\n </div>\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\r\n #listScrollContainer>\r\n <ng-container *ngIf=\"!apiLoading\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\r\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\r\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\r\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\r\n [index]=\"i\"></simpo-small-product-listing>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n </div>\r\n\r\n <div class=\"bottom-filter\">\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Sort by</span>\r\n </div>\r\n <div class=\"divider\"></div>\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span>Filter</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\r\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\r\n\r\n<ng-template #FavouriteTags let-product=\"data\">\r\n <div class=\"fav-icon-wrapper\">\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\r\n </mat-icon>\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\r\n </mat-icon>\r\n <span class=\"fav-tooltip\">\r\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #Tags let-product=\"data\">\r\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\r\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\r\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\r\n {{ tag }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #FilterSection>\r\n <section>\r\n <!-- Server-driven filters from query-options (Brand, Categories, Collections, Specifications, ...).\r\n Empty for unseeded businesses, in which case the legacy blocks below are the sidebar. -->\r\n <div class=\"categories-section\" *ngFor=\"let group of customFilterGroups\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"customGroupCollapsed[group.key] = !customGroupCollapsed[group.key]\" style=\"cursor:pointer\">\r\n <h6><b>{{ group.label }}</b></h6>\r\n <mat-icon>{{ customGroupCollapsed[group.key] ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!customGroupCollapsed[group.key]\">\r\n <ng-container *ngFor=\"let filter of group.filters\">\r\n <div *ngIf=\"group.filters.length > 1\" class=\"trim-text\" style=\"font-weight: 600; margin-top: 8px;\">\r\n {{ filter.label }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"filter.control === 'RANGE'; else customChoices\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-top: 6px;\">\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Min ' + (filter.min ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).min\"\r\n (change)=\"setCustomRange(filter.identifier, 'min', $any($event.target).value)\" />\r\n <span>-</span>\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Max ' + (filter.max ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).max\"\r\n (change)=\"setCustomRange(filter.identifier, 'max', $any($event.target).value)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #customChoices>\r\n <ng-container *ngIf=\"filter.control === 'BOOLEAN' && !filter.choices?.length; else choiceList\">\r\n <label class=\"category-options\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, 'true')\"\r\n (change)=\"toggleCustomChoice(filter, 'true')\" />\r\n <div class=\"trim-text\">Yes</div>\r\n </label>\r\n </ng-container>\r\n <ng-template #choiceList>\r\n <label class=\"category-options\" *ngFor=\"let choice of filter.choices\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, choice.value)\"\r\n (change)=\"toggleCustomChoice(filter, choice.value)\" />\r\n <div class=\"trim-text\">{{ choice.label }} <span *ngIf=\"choice.count !== undefined\">({{ choice.count }})</span></div>\r\n </label>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- No legacy Categories block: categories are shown only when query-options returns them. -->\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Product Type</b></h6>\r\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!productTypeCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop for</b></h6>\r\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!shopForCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Material</b></h6>\r\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!materialCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Metal</b></h6>\r\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!metalCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ring Style</b></h6>\r\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ringStyleCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Ratings and price stay at the bottom, below the server-driven filters. -->\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ratings</b></h6>\r\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ratingsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"rating.selected\" />\r\n <div class=\"trim-text\">{{ rating.label }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by price</b></h6>\r\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!priceCollapsed\">\r\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\r\n <div class=\"trim-text\">{{ range.label }}</div>\r\n </label>\r\n </ng-container>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SortingSection>\r\n <section style=\"padding: 10px\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\r\n <span>Sort by</span>\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\r\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\r\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\r\n </mat-radio-group>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\r\n <ng-template #theme1style1>\r\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\r\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\r\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div class=\"mt-2 w-100\">\r\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\r\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\r\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\r\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\r\n (click)=\"selectVarient(product, varient)\">\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\r\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\r\n <div class=\"fs-16\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n\r\n <div class=\"fs-16 text-start\">\r\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\r\n {{product?.price?.value | number:'1.0-0'}}\r\n </span>\r\n </div>\r\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\r\n <span [innerHTML]='currency'></span>\r\n {{product.price.sellingPrice | number:'1.0-0'}}\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"product-name heading-large w-100 text-left trim-text\"\r\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n\r\n <div class=\"material-info\"\r\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\r\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\r\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\r\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-8 d-flex flex-column gap-3\">\r\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n <div class=\"fs-16 text-start\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n <div class=\"d-flex w-45\">\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn w-100\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section w-100\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-4 h-100 position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n</ng-template>\r\n\r\n\r\n\r\n", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.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: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i13.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i14.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i15.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i16.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i17.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: CardSkeletonLoaderComponent, selector: "simpo-card-skeleton-loader", inputs: ["count", "showTitles"] }, { kind: "component", type: SmallProductListingComponent, selector: "simpo-small-product-listing", inputs: ["product", "data", "isScrollable", "isCategoryProductList", "customClass", "index"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }] }); }
|
|
1273
1273
|
}
|
|
1274
1274
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, decorators: [{
|
|
1275
1275
|
type: Component,
|
|
@@ -1296,7 +1296,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1296
1296
|
MatChipsModule,
|
|
1297
1297
|
ButtonEditorDirective,
|
|
1298
1298
|
SpacingHorizontalDirective,
|
|
1299
|
-
], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\r\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\r\n</div> -->\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\r\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\r\n [spacingHorizontal]=\"stylesLayout\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\"\r\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\r\n </div> -->\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\r\n CLEAR ALL\r\n </div>\r\n </div>\r\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\r\n style=\"width: 77.5%; margin-right: 1%;\">\r\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\">\r\n <ng-container *ngFor=\"let filter of displayChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\r\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\r\n </select>\r\n </div> -->\r\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\r\n <span class=\"sort-label\">Sort By:</span>\r\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\r\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">▾</span> <!-- Down arrow, rotates open -->\r\n\r\n <div class=\"options\" *ngIf=\"isOpen\">\r\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\r\n (click)=\"selectOption(filter, $event)\">\r\n {{ filter.name }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isMobile\" class=\"d-flex w-100 onlyMobile gap-15 flex-wrap\">\r\n <ng-container *ngFor=\"let filter of displayChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"main-product-section\">\r\n <div class=\"filter-side\">\r\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\r\n </div>\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\r\n #listScrollContainer>\r\n <ng-container *ngIf=\"!apiLoading\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\r\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\r\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\r\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\r\n [index]=\"i\"></simpo-small-product-listing>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n </div>\r\n\r\n <div class=\"bottom-filter\">\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Sort by</span>\r\n </div>\r\n <div class=\"divider\"></div>\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span>Filter</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\r\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\r\n\r\n<ng-template #FavouriteTags let-product=\"data\">\r\n <div class=\"fav-icon-wrapper\">\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\r\n </mat-icon>\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\r\n </mat-icon>\r\n <span class=\"fav-tooltip\">\r\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #Tags let-product=\"data\">\r\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\r\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\r\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\r\n {{ tag }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #FilterSection>\r\n <section>\r\n <!-- Server-driven filters from query-options (Brand, Categories, Collections, Specifications, ...).\r\n Empty for unseeded businesses, in which case the legacy blocks below are the sidebar. -->\r\n <div class=\"categories-section\" *ngFor=\"let group of customFilterGroups\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"customGroupCollapsed[group.key] = !customGroupCollapsed[group.key]\" style=\"cursor:pointer\">\r\n <h6><b>{{ group.label }}</b></h6>\r\n <mat-icon>{{ customGroupCollapsed[group.key] ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!customGroupCollapsed[group.key]\">\r\n <ng-container *ngFor=\"let filter of group.filters\">\r\n <div *ngIf=\"group.filters.length > 1\" class=\"trim-text\" style=\"font-weight: 600; margin-top: 8px;\">\r\n {{ filter.label }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"filter.control === 'RANGE'; else customChoices\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-top: 6px;\">\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Min ' + (filter.min ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).min\"\r\n (change)=\"setCustomRange(filter.identifier, 'min', $any($event.target).value)\" />\r\n <span>-</span>\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Max ' + (filter.max ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).max\"\r\n (change)=\"setCustomRange(filter.identifier, 'max', $any($event.target).value)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #customChoices>\r\n <ng-container *ngIf=\"filter.control === 'BOOLEAN' && !filter.choices?.length; else choiceList\">\r\n <label class=\"category-options\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, 'true')\"\r\n (change)=\"toggleCustomChoice(filter, 'true')\" />\r\n <div class=\"trim-text\">Yes</div>\r\n </label>\r\n </ng-container>\r\n <ng-template #choiceList>\r\n <label class=\"category-options\" *ngFor=\"let choice of filter.choices\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, choice.value)\"\r\n (change)=\"toggleCustomChoice(filter, choice.value)\" />\r\n <div class=\"trim-text\">{{ choice.label }} <span *ngIf=\"choice.count !== undefined\">({{ choice.count }})</span></div>\r\n </label>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- No legacy Categories block: categories are shown only when query-options returns them. -->\r\n\r\n <div class=\"categories-section\" *ngIf=\"collections?.length && !isApiFilter('collection')\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"collectionsCollapsed = !collectionsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Collections</b></h6>\r\n <mat-icon>{{ collectionsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!collectionsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let collection of displayedCollections\"\r\n (click)=\"applyFilter(collection, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"collection.status\" />\r\n <div class=\"trim-text\">{{collection.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"collections.length > 4\" class=\"toggle-categories\" (click)=\"toggleCollections()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllCollections ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllCollections\"><mat-icon>expand_more</mat-icon></ng-container>\r\n <ng-container *ngIf=\"showAllCollections\"><mat-icon>expand_less</mat-icon></ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"(brands?.length ?? 0) > 1 && !isApiFilter('brand')\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"brandsCollapsed = !brandsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Brand</b></h6>\r\n <mat-icon>{{ brandsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!brandsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let brand of displayedBrands\"\r\n (click)=\"applyFilter(brand, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"brand.status\" />\r\n <div class=\"trim-text\">{{brand.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"brands.length > 4\" class=\"toggle-categories\" (click)=\"toggleBrands()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllBrands ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllBrands\"><mat-icon>expand_more</mat-icon></ng-container>\r\n <ng-container *ngIf=\"showAllBrands\"><mat-icon>expand_less</mat-icon></ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Product Type</b></h6>\r\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!productTypeCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop for</b></h6>\r\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!shopForCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Material</b></h6>\r\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!materialCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Metal</b></h6>\r\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!metalCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ring Style</b></h6>\r\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ringStyleCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Ratings and price stay at the bottom, below the server-driven filters. -->\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ratings</b></h6>\r\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ratingsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"rating.selected\" />\r\n <div class=\"trim-text\">{{ rating.label }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by price</b></h6>\r\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!priceCollapsed\">\r\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\r\n <div class=\"trim-text\">{{ range.label }}</div>\r\n </label>\r\n </ng-container>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SortingSection>\r\n <section style=\"padding: 10px\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\r\n <span>Sort by</span>\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\r\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\r\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\r\n </mat-radio-group>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\r\n <ng-template #theme1style1>\r\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\r\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\r\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div class=\"mt-2 w-100\">\r\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\r\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\r\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\r\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\r\n (click)=\"selectVarient(product, varient)\">\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\r\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\r\n <div class=\"fs-16\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n\r\n <div class=\"fs-16 text-start\">\r\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\r\n {{product?.price?.value | number:'1.0-0'}}\r\n </span>\r\n </div>\r\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\r\n <span [innerHTML]='currency'></span>\r\n {{product.price.sellingPrice | number:'1.0-0'}}\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"product-name heading-large w-100 text-left trim-text\"\r\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n\r\n <div class=\"material-info\"\r\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\r\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\r\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\r\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-8 d-flex flex-column gap-3\">\r\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n <div class=\"fs-16 text-start\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n <div class=\"d-flex w-45\">\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn w-100\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section w-100\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-4 h-100 position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n</ng-template>\r\n\r\n\r\n\r\n", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"] }]
|
|
1299
|
+
], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\r\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\r\n</div> -->\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\r\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\r\n [spacingHorizontal]=\"stylesLayout\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\"\r\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\r\n </div> -->\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\r\n CLEAR ALL\r\n </div>\r\n </div>\r\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\r\n style=\"width: 77.5%; margin-right: 1%;\">\r\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\"></div>\r\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\r\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\r\n </select>\r\n </div> -->\r\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\r\n <span class=\"sort-label\">Sort By:</span>\r\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\r\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">▾</span> <!-- Down arrow, rotates open -->\r\n\r\n <div class=\"options\" *ngIf=\"isOpen\">\r\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\r\n (click)=\"selectOption(filter, $event)\">\r\n {{ filter.name }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"main-product-section\">\r\n <div class=\"filter-side\">\r\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\r\n </div>\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\r\n #listScrollContainer>\r\n <ng-container *ngIf=\"!apiLoading\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\r\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\r\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\r\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\r\n [index]=\"i\"></simpo-small-product-listing>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n </div>\r\n\r\n <div class=\"bottom-filter\">\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Sort by</span>\r\n </div>\r\n <div class=\"divider\"></div>\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span>Filter</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\r\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\r\n\r\n<ng-template #FavouriteTags let-product=\"data\">\r\n <div class=\"fav-icon-wrapper\">\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\r\n </mat-icon>\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\r\n </mat-icon>\r\n <span class=\"fav-tooltip\">\r\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #Tags let-product=\"data\">\r\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\r\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\r\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\r\n {{ tag }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #FilterSection>\r\n <section>\r\n <!-- Server-driven filters from query-options (Brand, Categories, Collections, Specifications, ...).\r\n Empty for unseeded businesses, in which case the legacy blocks below are the sidebar. -->\r\n <div class=\"categories-section\" *ngFor=\"let group of customFilterGroups\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"customGroupCollapsed[group.key] = !customGroupCollapsed[group.key]\" style=\"cursor:pointer\">\r\n <h6><b>{{ group.label }}</b></h6>\r\n <mat-icon>{{ customGroupCollapsed[group.key] ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!customGroupCollapsed[group.key]\">\r\n <ng-container *ngFor=\"let filter of group.filters\">\r\n <div *ngIf=\"group.filters.length > 1\" class=\"trim-text\" style=\"font-weight: 600; margin-top: 8px;\">\r\n {{ filter.label }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"filter.control === 'RANGE'; else customChoices\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-top: 6px;\">\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Min ' + (filter.min ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).min\"\r\n (change)=\"setCustomRange(filter.identifier, 'min', $any($event.target).value)\" />\r\n <span>-</span>\r\n <input type=\"number\" class=\"form-control\" style=\"min-width: 0;\" [attr.min]=\"filter.min\"\r\n [attr.max]=\"filter.max\" [placeholder]=\"'Max ' + (filter.max ?? '')\"\r\n [ngModel]=\"customRange(filter.identifier).max\"\r\n (change)=\"setCustomRange(filter.identifier, 'max', $any($event.target).value)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #customChoices>\r\n <ng-container *ngIf=\"filter.control === 'BOOLEAN' && !filter.choices?.length; else choiceList\">\r\n <label class=\"category-options\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, 'true')\"\r\n (change)=\"toggleCustomChoice(filter, 'true')\" />\r\n <div class=\"trim-text\">Yes</div>\r\n </label>\r\n </ng-container>\r\n <ng-template #choiceList>\r\n <label class=\"category-options\" *ngFor=\"let choice of filter.choices\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"isCustomChoiceSelected(filter.identifier, choice.value)\"\r\n (change)=\"toggleCustomChoice(filter, choice.value)\" />\r\n <div class=\"trim-text\">{{ choice.label }} <span *ngIf=\"choice.count !== undefined\">({{ choice.count }})</span></div>\r\n </label>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- No legacy Categories block: categories are shown only when query-options returns them. -->\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Product Type</b></h6>\r\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!productTypeCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop for</b></h6>\r\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!shopForCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Material</b></h6>\r\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!materialCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Metal</b></h6>\r\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!metalCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ring Style</b></h6>\r\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ringStyleCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Ratings and price stay at the bottom, below the server-driven filters. -->\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ratings</b></h6>\r\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ratingsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"rating.selected\" />\r\n <div class=\"trim-text\">{{ rating.label }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by price</b></h6>\r\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!priceCollapsed\">\r\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\r\n <div class=\"trim-text\">{{ range.label }}</div>\r\n </label>\r\n </ng-container>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SortingSection>\r\n <section style=\"padding: 10px\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\r\n <span>Sort by</span>\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\r\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\r\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\r\n </mat-radio-group>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\r\n <ng-template #theme1style1>\r\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\r\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\r\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div class=\"mt-2 w-100\">\r\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\r\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\r\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\r\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\r\n (click)=\"selectVarient(product, varient)\">\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\r\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\r\n <div class=\"fs-16\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n\r\n <div class=\"fs-16 text-start\">\r\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\r\n {{product?.price?.value | number:'1.0-0'}}\r\n </span>\r\n </div>\r\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\r\n <span [innerHTML]='currency'></span>\r\n {{product.price.sellingPrice | number:'1.0-0'}}\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"product-name heading-large w-100 text-left trim-text\"\r\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n\r\n <div class=\"material-info\"\r\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\r\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\r\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\r\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-8 d-flex flex-column gap-3\">\r\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n <div class=\"fs-16 text-start\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n <div class=\"d-flex w-45\">\r\n <div\r\n *ngIf=\"content?.display?.showButton && !appointmentSettings?.homeVisitProductsEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn w-100\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section w-100\"\r\n *ngIf=\"content?.display?.showButton && appointmentSettings?.homeVisitProductsEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"addVideoCallCurrent(product)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-4 h-100 position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n</ng-template>\r\n\r\n\r\n\r\n", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"] }]
|
|
1300
1300
|
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
1301
1301
|
type: Inject,
|
|
1302
1302
|
args: [PLATFORM_ID]
|
|
@@ -1327,4 +1327,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1327
1327
|
type: ViewChild,
|
|
1328
1328
|
args: ['filterScroll', { static: true }]
|
|
1329
1329
|
}] } });
|
|
1330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBNkIsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRWhKLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBS3hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFrQixhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFP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RUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzFFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1NBQzlFLENBQUM7UUFFRixrQkFBYSxHQUF5QjtZQUNwQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFB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c0JBRFosWUFBWTt1QkFBQyxlQUFlO2dCQU03QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTQrQkksWUFBWTtzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIFBMQVRGT1JNX0lELCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEN1c3RvbUZpZWxkRmlsdGVyLCBGaWx0ZXJEZWYsIEZpbHRlckdyb3VwLCBJdGVtVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xyXG5pbXBvcnQgQmFzZVNlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc2VjdGlvbnMvQmFzZVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBQcm9kdWN0TGlzdENvbnRlbnRNb2RhbCwgUHJvZHVjdExpc3RNb2RhbCwgUHJvZHVjdExpc3RTdHlsZXNNb2RhbCB9IGZyb20gJy4vcHJvZHVjdC1saXN0Lm1vZGFsJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTW9kZWwsIEJ1dHRvbk1vZGVsLCBMYXlPdXRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IHBhcnNlTGlzdFBhdGgsIHNsdWdGcm9tTmFtZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xpc3Qtcm91dGUudXRpbCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IFBhZ25pbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnbmluYXRpb24vcGFnbmluYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vLi4vc3R5bGVzL09yZGVyZWRJdGVtcy5tb2RhbCc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0LCBNYXRCb3R0b21TaGVldE1vZHVsZSwgTWF0Qm90dG9tU2hlZXRSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9ib3R0b20tc2hlZXQnO1xyXG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQlVTSU5FU1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2J1c2luZXNzLmNvbnN0YW50JztcclxuaW1wb3J0IHsgRm9ybWF0ZUFtb3VudCB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2Ftb3VudC5waXBlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCb29raW5nUHJvZHVjdENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYm9va2luZy1wcm9kdWN0LWNhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNwZWVkRGlhbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc3BlZWRkaWFsJztcclxuaW1wb3J0IHsgU21hbGxQcm9kdWN0TGlzdGluZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9zbWFsbC1wcm9kdWN0LWxpc3Rpbmcvc21hbGwtcHJvZHVjdC1saXN0aW5nLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBQcm9kdWN0Q2FyZFRoZW1lIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL2luZGV4JztcclxuaW1wb3J0IHsgQ2FyZFNrZWxldG9uTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvY2FyZC1za2VsZXRvbi1sb2FkZXIvY2FyZC1za2VsZXRvbi1sb2FkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29sb3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29sb3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZWRpdG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3NwYWNpbmctaG9yaXpvbnRhbC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIGZvcmtKb2luLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbnRlcmZhY2UgQmFzZU1vZGVsIHtcclxuICBvcHRpb246IHN0cmluZyxcclxuICBpZDogc3RyaW5nLFxyXG4gIGltZ1VybDogc3RyaW5nLFxyXG4gIHN0YXR1czogYm9vbGVhbixcclxuICBzbHVnPzogc3RyaW5nXHJcbn1cclxuXHJcbmludGVyZmFjZSBSYXRpbmdGaWx0ZXJPcHRpb24ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgbWluOiBudW1iZXI7XHJcbiAgbWF4OiBudW1iZXI7XHJcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcG8tcHJvZHVjdC1saXN0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgU2ltcG9Db21wb25lbnRNb2R1bGUsXHJcbiAgICBNYXRTbGlkZXJNb2R1bGUsXHJcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXHJcbiAgICBTcGVlZERpYWxNb2R1bGUsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxyXG4gICAgTWF0UmFkaW9Nb2R1bGUsXHJcbiAgICBGb3JtYXRlQW1vdW50LFxyXG4gICAgVG9hc3RNb2R1bGUsXHJcbiAgICBDYXJkU2tlbGV0b25Mb2FkZXJDb21wb25lbnQsXHJcbiAgICBTbWFsbFByb2R1Y3RMaXN0aW5nQ29tcG9uZW50LFxyXG4gICAgQ29sb3JEaXJlY3RpdmUsXHJcbiAgICBNYXRDaGlwc01vZHVsZSxcclxuICAgIEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSxcclxuICAgIFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlLFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RMaXN0Q29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YT86IFByb2R1Y3RbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0TGlzdE1vZGFsO1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGVkaXQ/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbmV4dENvbXBvbmVudENvbG9yPzogQmFja2dyb3VuZE1vZGVsO1xyXG5cclxuICB0YWdJbmRleE1hcDogeyBbaXRlbUlkOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gIHByaXZhdGUgdGFnSW50ZXJ2YWw6IGFueTtcclxuXHJcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYXBpTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTGlzdExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0FsbExpc3RMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29udGVudD86IFByb2R1Y3RMaXN0Q29udGVudE1vZGFsO1xyXG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsO1xyXG4gIHRvdGFsUGFnZXM6IG51bWJlciA9IDA7XHJcbiAgc2Nyb2xsaW5nVmFsdWU6IG51bWJlciA9IDA7XHJcbiAgcHJpY2luZ01pbjogbnVtYmVyID0gMDtcclxuICBwcmljaW5nTWF4OiBudW1iZXIgPSAwO1xyXG4gIG1pblJhdGluZzogbnVtYmVyID0gMDtcclxuICBtYXhSYXRpbmc6IG51bWJlciA9IDA7XHJcbiAgc29ydEJ5OiBzdHJpbmcgPSAnJztcclxuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBwcml2YXRlIFVTRVJfQ0FSVDogT3JkZXJlZEl0ZW1zW10gPSBbXTtcclxuICBwcml2YXRlIFVTRVJfV0lTSExJU1Q6IE9yZGVyZWRJdGVtc1tdID0gW107XHJcbiAgbWluUHJvZHVjdFByaWNlOiBudW1iZXIgPSAwO1xyXG4gIG1heFByb2R1Y3RQcmljZTogbnVtYmVyID0gMDtcclxuICBmaWx0ZXJlZENoaXBzOiBhbnlbXSA9IFtdXHJcbiAgZmlsdGVyZWRQcmljZUNoaXA6IGFueVtdID0gW11cclxuICBmaWx0ZXJpbmdBcnJheSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJMYXRlc3RcIiwgdmFsdWU6ICcnLFxyXG4gICAgfSxcclxuICAgIHsgbmFtZTogXCJQcmljZTogTG93IHRvIEhpZ2hcIiwgdmFsdWU6IFwibG93ZXN0UHJpY2VcIiB9LFxyXG4gICAgeyBuYW1lOiBcIlByaWNlOiBIaWdoIHRvIExvd1wiLCB2YWx1ZTogXCJoaWdoZXN0UHJpY2VcIiB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnQ3VzdG9tZXIgcmF0aW5nJywgdmFsdWU6ICdjdXN0b21lclJhdGluZydcclxuICAgIH1cclxuICBdO1xyXG5cclxuICAvLyBGaWx0ZXJzIHRoZSBzZXJ2ZXIgYWxyZWFkeSBtYXBzIG9udG8gYnJhbmRJZCAvIG1pblByaWNlK21heFByaWNlIC8gY2F0ZWdvcnlJZCAvIGNvbGxlY3Rpb25JZC5cclxuICAvLyBUaGUgbGVnYWN5IGJsb2NrcyBkcml2ZSB0aG9zZSwgc28gdGhleSBtdXN0IG5ldmVyIGJlIHNlbnQgaW4gY3VzdG9tRmllbGRGaWx0ZXJzLlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1lTVEVNX0ZJTFRFUl9JRFMgPSBbJ2JyYW5kJywgJ3NlbGxpbmdQcmljZScsICdjYXRlZ29yeScsICdjb2xsZWN0aW9uJ107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBCVUlMVF9JTl9TT1JUUyA9IFsnJywgJ25ld2VzdCcsICdsb3dlc3RQcmljZScsICdoaWdoZXN0UHJpY2UnLCAnY3VzdG9tZXJSYXRpbmcnXTtcclxuXHJcbiAgLy8gU2VydmVyLWRyaXZlbiBmaWx0ZXIgZ3JvdXBzIChxdWVyeS1vcHRpb25zKSwgbWludXMgdGhlIHN5c3RlbSBvbmVzIGFib3ZlLlxyXG4gIGN1c3RvbUZpbHRlckdyb3VwczogRmlsdGVyR3JvdXBbXSA9IFtdO1xyXG4gIGN1c3RvbUNob2ljZVNlbGVjdGlvbnM6IHsgW2lkZW50aWZpZXI6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuICBjdXN0b21SYW5nZVNlbGVjdGlvbnM6IHsgW2lkZW50aWZpZXI6IHN0cmluZ106IHsgbWluOiBzdHJpbmcsIG1heDogc3RyaW5nIH0gfSA9IHt9O1xyXG4gIGN1c3RvbUdyb3VwQ29sbGFwc2VkOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gIHByaXZhdGUgZmlsdGVyT3B0aW9uc0tleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIENhdGVnb3J5L2NvbGxlY3Rpb24gdG9rZW5zIGZyb20gdGhlIFVSTCB0aGF0IG1hdGNoZWQgbm90aGluZyBpbiB0aGUgbG9hZGVkIGxpc3RzXHJcbiAgLy8gKHRoZSBjYXRlZ29yeSBsaXN0IGlzIFwiZmVhdHVyZWRcIiBvbmx5KS4gU2VudCBhcyBjYXRlZ29yeVNsdWdOYW1lIC8gY29sbGVjdGlvblNsdWdOYW1lLlxyXG4gIHVybENhdGVnb3J5U2x1Z3M6IHN0cmluZ1tdID0gW107XHJcbiAgdXJsQ29sbGVjdGlvblNsdWdzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBzY3JlZW5XaWR0aDogbnVtYmVyID0gMDtcclxuICBmaWx0ZXJMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHN0eWxlcz86IFByb2R1Y3RMaXN0U3R5bGVzTW9kYWw7XHJcbiAgdG90YWxDb3VudDogbnVtYmVyID0gMDtcclxuICBwYWdlTm86IG51bWJlciA9IDE7XHJcbiAgc2l6ZTogbnVtYmVyID0gMjA7XHJcbiAgc2VhcmNoVHh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIHRoZW1lID0gUHJvZHVjdENhcmRUaGVtZTtcclxuICBpdGVtczogTWVudUl0ZW1bXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBsYXRlc3RBbmFseWljc0V2ZW50OiBzdHJpbmcgPSAnUFJPRFVDVF9MSVNUX1ZJRVcnO1xyXG5cclxuICBwcml2YXRlIGZpbHRlckJvdHRvbVNoZWV0UmVmOiBNYXRCb3R0b21TaGVldFJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc29ydGluZ0RpYWxvZ1JlZjogTWF0Qm90dG9tU2hlZXRSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcclxuICBjYXRlZ29yaWVzOiBCYXNlTW9kZWxbXSA9IFtdO1xyXG4gIGNvbGxlY3Rpb25zOiBCYXNlTW9kZWxbXSA9IFtdO1xyXG4gIGJyYW5kczogQmFzZU1vZGVsW10gPSBbXTtcclxuXHJcbiAgaW1hZ2VJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2xpc3RTY3JvbGxDb250YWluZXInKSBsaXN0U2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXHJcbiAgZ2V0U2NyZWVuU2l6ZSgpIHtcclxuICAgIHRoaXMuc2NyZWVuV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxyXG4gIG9uV2luZG93U2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY3JvbGxpbmdWYWx1ZSA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXRCb3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZTogQm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIHRoaXMuZ2V0U2NyZWVuU2l6ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuc3R5bGVzPy5sYXlvdXQgfSBhcyBMYXlPdXRNb2RlbDtcclxuICB9XHJcblxyXG4gIGlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICB0b2dnbGVEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgdGhlc2UgY2xhc3MtbGV2ZWwgcHJvcGVydGllcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50OlxyXG4gIHByaWNlUmFuZ2VzID0gW1xyXG4gICAgeyBsYWJlbDogJ+KCuTEsMDAwIC0g4oK5NSwwMDAnLCBtaW46IDEwMDAsIG1heDogNTAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5NSwwMDAgLSDigrkxNSwwMDAnLCBtaW46IDUwMDAsIG1heDogMTUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTE1LDAwMCAtIOKCuTI1LDAwMCcsIG1pbjogMTUwMDAsIG1heDogMjUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTI1LDAwMCAtIOKCuTMwLDAwMCcsIG1pbjogMjUwMDAsIG1heDogMzAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTMwLDAwMCAtIOKCuTUwLDAwMCcsIG1pbjogMzAwMDAsIG1heDogNTAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTUwLDAwMCAtIOKCuTc1LDAwMCcsIG1pbjogNTAwMDAsIG1heDogNzUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTc1LDAwMCAtIOKCuTEsMDAsMDAwJywgbWluOiA3NTAwMCwgbWF4OiAxMDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTEsMDAsMDAwIC0g4oK5MiwwMCwwMDAnLCBtaW46IDEwMDAwMCwgbWF4OiAyMDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTIsMDAsMDAwIC0g4oK5MywwMCwwMDAnLCBtaW46IDIwMDAwMCwgbWF4OiAzMDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTMsMDAsMDAwIC0g4oK5NCwwMCwwMDAnLCBtaW46IDMwMDAwMCwgbWF4OiA0MDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTQsMDAsMDAwIC0g4oK5NSwwMCwwMDAnLCBtaW46IDQwMDAwMCwgbWF4OiA1MDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTUsMDAsMDAwIC0g4oK5NiwwMCwwMDAnLCBtaW46IDUwMDAwMCwgbWF4OiA2MDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9XHJcbiAgXTtcclxuXHJcbiAgcmF0aW5nT3B0aW9uczogUmF0aW5nRmlsdGVyT3B0aW9uW10gPSBbXHJcbiAgICB7IGxhYmVsOiAnNSBTdGFycycsIG1pbjogNSwgbWF4OiA1LCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICc0IFN0YXJzIGFib3ZlJywgbWluOiA0LCBtYXg6IDUsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJzMgU3RhcnMgYWJvdmUnLCBtaW46IDMsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAnMiBTdGFycyBhYm92ZScsIG1pbjogMiwgbWF4OiA1LCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICcxIFN0YXIgYWJvdmUnLCBtaW46IDEsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH1cclxuICBdO1xyXG5cclxuICAvLyBDYWxsZWQgd2hlbiB1c2VyIGNoYW5nZXMgcHJpY2UgcmFuZ2Ugc2VsZWN0aW9uXHJcbiAgb25QcmljZVJhbmdlQ2hhbmdlKGluZGV4PzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFJhbmdlcyA9IHRoaXMucHJpY2VSYW5nZXNcclxuICAgICAgLmZpbHRlcihyYW5nZSA9PiByYW5nZS5zZWxlY3RlZClcclxuICAgICAgLm1hcChyYW5nZSA9PiAoeyBtaW46IHJhbmdlLm1pbiwgbWF4OiByYW5nZS5tYXggfSkpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZFJhbmdlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgLy8gTm8gcHJpY2UgZmlsdGVyIGFjdGl2ZSwgcmVzZXQgbWluL21heCB0byB0aGUgZnVsbCByYW5nZVxyXG4gICAgICB0aGlzLnByaWNpbmdNaW4gPSB0aGlzLm1pblByb2R1Y3RQcmljZTtcclxuICAgICAgdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5tYXhQcm9kdWN0UHJpY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBDYWxjdWxhdGUgY29tYmluZWQgbWluIGFuZCBtYXggZnJvbSBzZWxlY3RlZCByYW5nZXMg4oCUXHJcbiAgICAgIC8vIHNldCBwcmljaW5nTWluIGFzIHNtYWxsZXN0IG1pbiBmcm9tIGNoZWNrZWQgcmFuZ2VzLFxyXG4gICAgICAvLyBwcmljaW5nTWF4IGFzIGxhcmdlc3QgbWF4IGZyb20gY2hlY2tlZCByYW5nZXNcclxuICAgICAgdGhpcy5wcmljaW5nTWluID0gTWF0aC5taW4oLi4uc2VsZWN0ZWRSYW5nZXMubWFwKHIgPT4gci5taW4pKTtcclxuICAgICAgdGhpcy5wcmljaW5nTWF4ID0gTWF0aC5tYXgoLi4uc2VsZWN0ZWRSYW5nZXMubWFwKHIgPT4gci5tYXgpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByaWNlUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgIGlmIChpICE9PSBpbmRleCkge1xyXG4gICAgLy8gICAgIHRoaXMucHJpY2VSYW5nZXNbaV0uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLnByaWNpbmdNaW4gPSBNYXRoLm1pbiguLi50aGlzLnByaWNlUmFuZ2VzLmZpbHRlcihyID0+IHIuc2VsZWN0ZWQpLm1hcChyID0+IHIubWluKSk7XHJcbiAgICAvLyAgIHRoaXMucHJpY2luZ01heCA9IE1hdGgubWF4KC4uLnRoaXMucHJpY2VSYW5nZXMuZmlsdGVyKHIgPT4gci5zZWxlY3RlZCkubWFwKHIgPT4gci5tYXgpKTtcclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcclxuICAgIF07XHJcbiAgICAvLyBZb3UgY2FuIGF1dG8tdHJpZ2dlciBmaWx0ZXIgb3Igb25seSBvbiBidXR0b24gY2xpY2sgKHlvdXIgY2hvaWNlKVxyXG4gICAgLy8gRm9yIGF1dG8gZmlsdGVyIHVuY29tbWVudCBuZXh0IGxpbmU6XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcblxyXG4gICAgLy8gRWxzZSwgZmlsdGVyaW5nIGhhcHBlbnMgd2hlbiB1c2VyIGNsaWNrcyBcIkZpbHRlclwiIGJ1dHRvblxyXG4gIH1cclxuXHJcbiAgb25SYXRpbmdDaGFuZ2Uoc2VsZWN0ZWRSYXRpbmc6IFJhdGluZ0ZpbHRlck9wdGlvbikge1xyXG4gICAgc2VsZWN0ZWRSYXRpbmcuc2VsZWN0ZWQgPSAhc2VsZWN0ZWRSYXRpbmcuc2VsZWN0ZWQ7XHJcbiAgICBjb25zdCBzZWxlY3RlZFJhdGluZ3MgPSB0aGlzLnJhdGluZ09wdGlvbnMuZmlsdGVyKChyYXRpbmcpID0+IHJhdGluZy5zZWxlY3RlZCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkUmF0aW5ncy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5taW5SYXRpbmcgPSAwO1xyXG4gICAgICB0aGlzLm1heFJhdGluZyA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1pblJhdGluZyA9IE1hdGgubWluKC4uLnNlbGVjdGVkUmF0aW5ncy5tYXAoKHJhdGluZykgPT4gcmF0aW5nLm1pbikpO1xyXG4gICAgICB0aGlzLm1heFJhdGluZyA9IE1hdGgubWF4KC4uLnNlbGVjdGVkUmF0aW5ncy5tYXAoKHJhdGluZykgPT4gcmF0aW5nLm1heCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICBdO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgLy8gTW9kaWZ5IHlvdXIgZXhpc3RpbmcgYXBwbHlGaWx0ZXIoKSBtZXRob2QsIGFkZGluZyBwcmljZSByYW5nZSBsb2dpY1xyXG4gIGFwcGx5RmlsdGVyKGNhdGVnb3J5PzogYW55LCB0eXBlPzogJ1NPUlQnIHwgJ0ZJTFRFUicpIHtcclxuICAgIHRoaXMucGFnZU5vID0gMTtcclxuXHJcbiAgICBpZiAodHlwZSA9PT0gJ1NPUlQnKSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0QW5hbHlpY3NFdmVudCA9ICdTT1JUX0FQUExJRUQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxhdGVzdEFuYWx5aWNzRXZlbnQgPSAnRklMVEVSX0FQUExJRUQnXHJcbiAgICB9XHJcblxyXG4gICAgLy8gWW91ciBleGlzdGluZyBjYXRlZ29yeS9maWx0ZXIgdG9nZ2xpbmdcclxuICAgIGlmICh0eXBlID09PSBcIkZJTFRFUlwiICYmIGNhdGVnb3J5KSB7XHJcbiAgICAgIGNhdGVnb3J5LnN0YXR1cyA9ICFjYXRlZ29yeS5zdGF0dXM7XHJcbiAgICAgIC8vIE9uY2UgdGhlIHNob3BwZXIgcGlja3MgZnJvbSB0aGUgc2lkZWJhciwgdGhlIFVSTCBzbHVncyBubyBsb25nZXIgYXBwbHkuXHJcbiAgICAgIGlmICh0aGlzLmNhdGVnb3JpZXMuaW5jbHVkZXMoY2F0ZWdvcnkpIHx8IHRoaXMuY29sbGVjdGlvbnMuaW5jbHVkZXMoY2F0ZWdvcnkpKSB7XHJcbiAgICAgICAgdGhpcy51cmxDYXRlZ29yeVNsdWdzID0gW107XHJcbiAgICAgICAgdGhpcy51cmxDb2xsZWN0aW9uU2x1Z3MgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnNLZXkgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuZmlsdGVyZWRDaGlwcy5wdXNoKHtuYW1lOiBjYXRlZ29yeS5vcHRpb24sIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicsIGlkOiBjYXRlZ29yeS5pZH0pXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcclxuICAgICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICAgIF07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIERpc21pc3MgYm90dG9tIHNoZWV0cyBpZiBvcGVuXHJcbiAgICB0aGlzLmZpbHRlckJvdHRvbVNoZWV0UmVmPy5kaXNtaXNzKCk7XHJcbiAgICB0aGlzLnNvcnRpbmdEaWFsb2dSZWY/LmRpc21pc3MoKTtcclxuXHJcbiAgICAvLyBOb3cgdHJpZ2dlciBmaWx0ZXJpbmcgd2l0aCBjdXJyZW50IHN0YXRlIGluY2x1ZGluZyBwcmljZSBmaWx0ZXJzXHJcbiAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgfVxyXG5cclxuICAvLyBNb2RpZnkgZmlsdGVySXRlbUxpc3QgdG8gc2VuZCB0aGUgY29ycmVjdCBwcmljZSBtaW4gYW5kIG1heDpcclxuICByYWlzZUxlYWQoKSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIGJ1c2luZXNzSWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJyksXHJcbiAgICAgIGVtYWlsOiB1c2VyRGV0YWlscz8uY29udGFjdD8uZW1haWwsXHJcbiAgICAgIG1lc3NhZ2U6IFwiXCIsXHJcbiAgICAgIG1vYmlsZU5vOiBcIlwiLFxyXG4gICAgICBtb3JlSW5mbzoge1xyXG4gICAgICAgIE5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxyXG4gICAgICAgIFwiTW9iaWxlIE51bWJlclwiOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubW9iaWxlLFxyXG4gICAgICAgIEVtYWlsOiB1c2VyRGV0YWlscz8uY29udGFjdD8uZW1haWwsXHJcbiAgICAgICAgXCJMZWFkIFNvdXJjZVwiOiBcIldlYnNpdGVcIixcclxuICAgICAgICBcIkxlYWQgU3RhdHVzXCI6IFwiTkVXXCJcclxuICAgICAgfSxcclxuICAgICAgbmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWVcclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuY3JlYXRlTGVhZChwYXlsb2FkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdUaGFuayB5b3UnLCBkZXRhaWw6ICdPdXIgdGVhbSB3aWxsIGNvbnRhY3QgeW91IHNvb24nIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIG9jY3VyZWQgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBwcmljZVJhbmdlRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZpbHRlckl0ZW1MaXN0KCkge1xyXG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucGFnZU5vID0gMTtcclxuICAgIHRoaXMuaXNBbGxMaXN0TG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZmV0Y2hBbmFseXRpY3MoKTtcclxuICAgIHRoaXMubG9hZEZpbHRlck9wdGlvbnMoKTtcclxuXHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEZpbHRlcmVkUHJvZHVjdChcclxuICAgICAgdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4geC5pZCksXHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4geC5pZCksXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCxcclxuICAgICAgdGhpcy5wcmljaW5nTWluLFxyXG4gICAgICB0aGlzLnByaWNpbmdNYXgsXHJcbiAgICAgIHRoaXMubWluUmF0aW5nLFxyXG4gICAgICB0aGlzLm1heFJhdGluZyxcclxuICAgICAgdGhpcy5zb3J0QnkgPz8gXCJcIixcclxuICAgICAgdGhpcy5wYWdlTm8gLSAxLFxyXG4gICAgICB0aGlzLnNpemUsXHJcbiAgICAgIHRoaXMuYnJhbmRzLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKSxcclxuICAgICAgdGhpcy5jdXN0b21TZWFyY2hPcHRpb25zXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLmRhdGEgPz8gW107XHJcbiAgICAgIHRoaXMudG90YWxDb3VudCA9IHJlc3BvbnNlLmNvdW50ID8/IDA7XHJcblxyXG4gICAgICBpZiAoIXRoaXMucHJpY2VSYW5nZUZsYWcpIHtcclxuICAgICAgICB0aGlzLmR5bmFtaWNQcmljZVJhbmdlKHJlc3BvbnNlLm1pblByaWNlLCByZXNwb25zZS5tYXhQcmljZSk7XHJcbiAgICAgICAgdGhpcy5wcmljZVJhbmdlRmxhZyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0FsbExpc3RMb2FkZWQgPSAodGhpcy5yZXNwb25zZURhdGE/Lmxlbmd0aCA/PyAwKSA+PSB0aGlzLnRvdGFsQ291bnQ7XHJcbiAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVByb2R1Y3RDYXJ0V2lzaGxpc3RQcm9wZXJ0aWVzKCk7XHJcbiAgICB9LCBfZXJyID0+IHtcclxuICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvLyBFeHRyYSBzZWFyY2ggYm9keSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VydmVyLWRyaXZlbiBmaWx0ZXJzIGFuZCBjdXN0b20gc29ydHMuXHJcbiAgcHJpdmF0ZSBnZXQgY3VzdG9tU2VhcmNoT3B0aW9ucygpOiB7XHJcbiAgICBjdXN0b21GaWVsZEZpbHRlcnM6IEN1c3RvbUZpZWxkRmlsdGVyW10sXHJcbiAgICBzb3J0RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYycsXHJcbiAgICBjYXRlZ29yeVNsdWdOYW1lPzogc3RyaW5nW10sXHJcbiAgICBjb2xsZWN0aW9uU2x1Z05hbWU/OiBzdHJpbmdbXVxyXG4gIH0ge1xyXG4gICAgY29uc3QgY3VzdG9tRmllbGRGaWx0ZXJzOiBDdXN0b21GaWVsZEZpbHRlcltdID0gW107XHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnMpLmZvckVhY2goKFtpZGVudGlmaWVyLCB2YWx1ZXNdKSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoKSBjdXN0b21GaWVsZEZpbHRlcnMucHVzaCh7IGlkZW50aWZpZXIsIHZhbHVlcyB9KTtcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jdXN0b21SYW5nZVNlbGVjdGlvbnMpLmZvckVhY2goKFtpZGVudGlmaWVyLCByYW5nZV0pID0+IHtcclxuICAgICAgaWYgKHJhbmdlLm1pbiAhPT0gJycgfHwgcmFuZ2UubWF4ICE9PSAnJykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcjogQ3VzdG9tRmllbGRGaWx0ZXIgPSB7IGlkZW50aWZpZXIgfTtcclxuICAgICAgICBpZiAocmFuZ2UubWluICE9PSAnJykgZmlsdGVyLm1pbiA9IHJhbmdlLm1pbjtcclxuICAgICAgICBpZiAocmFuZ2UubWF4ICE9PSAnJykgZmlsdGVyLm1heCA9IHJhbmdlLm1heDtcclxuICAgICAgICBjdXN0b21GaWVsZEZpbHRlcnMucHVzaChmaWx0ZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIEEgY3VzdG9tLWZpZWxkIHNvcnQga2V5IG5lZWRzIGEgZGlyZWN0aW9uOyB0aGUgZm91ciBidWlsdC1pbiBzb3J0cyBtdXN0IG5vdCBzZW5kIG9uZS5cclxuICAgIGNvbnN0IGlzQ3VzdG9tU29ydCA9ICF0aGlzLkJVSUxUX0lOX1NPUlRTLmluY2x1ZGVzKHRoaXMuc29ydEJ5ID8/ICcnKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGN1c3RvbUZpZWxkRmlsdGVycyxcclxuICAgICAgc29ydERpcmVjdGlvbjogaXNDdXN0b21Tb3J0ID8gJ2FzYycgOiB1bmRlZmluZWQsXHJcbiAgICAgIGNhdGVnb3J5U2x1Z05hbWU6IHRoaXMudXJsQ2F0ZWdvcnlTbHVncyxcclxuICAgICAgY29sbGVjdGlvblNsdWdOYW1lOiB0aGlzLnVybENvbGxlY3Rpb25TbHVnc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFJlbG9hZHMgc2lkZWJhciBncm91cHMgKyBzb3J0cyBmcm9tIHF1ZXJ5LW9wdGlvbnMgd2hlbiB0aGUgYWN0aXZlIGNhdGVnb3J5L2NvbGxlY3Rpb24gY2hhbmdlcy5cclxuICAvLyBBbiB1bnNlZWRlZCBidXNpbmVzcyAob3IgYW55IGZhaWx1cmUpIGxlYXZlcyB0aGUgbGVnYWN5IHNpZGViYXIgYW5kIGZvdXIgYnVpbHQtaW4gc29ydHMgYXMgaXMuXHJcbiAgcHJpdmF0ZSBsb2FkRmlsdGVyT3B0aW9ucygpIHtcclxuICAgIC8vIE9uZSBjYWxsIHNjb3BlcyBieSBldmVyeSBzZWxlY3RlZCBjYXRlZ29yeS9jb2xsZWN0aW9uOiBpZHMgYW5kIHNsdWdzIGFyZSBhcnJheXMgaW4gdGhlIGJvZHkgYW5kXHJcbiAgICAvLyBhcmUgY29tYmluZWQuIEEgVVJMIHNsdWcgdGhhdCBtYXRjaGVkIG5vIGxvYWRlZCBjYXRlZ29yeS9jb2xsZWN0aW9uIChlLmcuIG9uZSBvdXRzaWRlIHRoZVxyXG4gICAgLy8gZmVhdHVyZWQgbGlzdCkgZ29lcyBpbiBhcyBhIHNsdWcuXHJcbiAgICBjb25zdCBzY29wZSA9IHtcclxuICAgICAgY2F0ZWdvcnlJZHM6IHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4geC5pZCksXHJcbiAgICAgIGNvbGxlY3Rpb25JZHM6IHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpLFxyXG4gICAgICBjYXRlZ29yeVNsdWdOYW1lczogWy4uLnRoaXMudXJsQ2F0ZWdvcnlTbHVnc10sXHJcbiAgICAgIGNvbGxlY3Rpb25TbHVnTmFtZXM6IFsuLi50aGlzLnVybENvbGxlY3Rpb25TbHVnc10sXHJcbiAgICB9O1xyXG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoc2NvcGUpO1xyXG4gICAgaWYgKGtleSA9PT0gdGhpcy5maWx0ZXJPcHRpb25zS2V5KSByZXR1cm47XHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnNLZXkgPSBrZXk7XHJcblxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRGaWx0ZXJPcHRpb25zKHNjb3BlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAob3B0aW9ucykgPT4ge1xyXG4gICAgICAgIGlmIChrZXkgIT09IHRoaXMuZmlsdGVyT3B0aW9uc0tleSkgcmV0dXJuOyAvLyBhIG5ld2VyIHNlbGVjdGlvbiBhbHJlYWR5IHJlcGxhY2VkIHRoaXMgb25lXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmluZ0FycmF5ID0gb3B0aW9ucy5zb3J0cy5tYXAoc29ydCA9PiAoe1xyXG4gICAgICAgICAgICBuYW1lOiBzb3J0LmxhYmVsLFxyXG4gICAgICAgICAgICB2YWx1ZTogc29ydC5rZXkgPT09ICduZXdlc3QnID8gJycgOiBzb3J0LmtleVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBCcmFuZCAvIENhdGVnb3JpZXMgLyBDb2xsZWN0aW9ucyBjb21lIGJhY2sgYXMgZ3JvdXBzIHRvby4gVGhleSBhcmUgZHJhd24gZnJvbSB0aGUgQVBJXHJcbiAgICAgICAgLy8gKHdpdGggY291bnRzKSBhbmQgc2VsZWN0aW5nIG9uZSBkcml2ZXMgdGhlIHNhbWUgc3RhdGUgdGhlIGxlZ2FjeSBibG9ja3MgdXNlLCBzbyB0aGVcclxuICAgICAgICAvLyBzZWFyY2ggc3RpbGwgc2VuZHMgYnJhbmRJZCAvIGNhdGVnb3J5SWQgLyBjb2xsZWN0aW9uSWQuIFNlbGxpbmcgUHJpY2Uga2VlcHMgdGhlIGxlZ2FjeVxyXG4gICAgICAgIC8vIHByaWNlIGJsb2NrLiBDdXN0b20gZmllbGRzIChDb2xvciwgLi4uKSBhcmUgc2hvd24gb24gamV3ZWxsZXJ5IHBhZ2VzIGFzIHdlbGwuXHJcbiAgICAgICAgdGhpcy5jdXN0b21GaWx0ZXJHcm91cHMgPSBvcHRpb25zLmdyb3Vwc1xyXG4gICAgICAgICAgLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICAgICAgZmlsdGVyczogZ3JvdXAuZmlsdGVycy5maWx0ZXIoZiA9PiBmLmlkZW50aWZpZXIgIT09ICdzZWxsaW5nUHJpY2UnKVxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgICAuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmZpbHRlcnMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIHRoaXMuYXBpRmlsdGVySWRzID0gbmV3IFNldCh0aGlzLmN1c3RvbUZpbHRlckdyb3Vwcy5mbGF0TWFwKGcgPT4gZy5maWx0ZXJzLm1hcChmID0+IGYuaWRlbnRpZmllcikpKTtcclxuXHJcbiAgICAgICAgLy8gRHJvcCBzZWxlY3Rpb25zIGZvciBmaWx0ZXJzIHRoYXQgZG8gbm90IGV4aXN0IG9uIHRoaXMgcGFnZSBhbnkgbW9yZS5cclxuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLmFwaUZpbHRlcklkcztcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnMpLmZvckVhY2goaWQgPT4geyBpZiAoIWF2YWlsYWJsZS5oYXMoaWQpKSBkZWxldGUgdGhpcy5jdXN0b21DaG9pY2VTZWxlY3Rpb25zW2lkXTsgfSk7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jdXN0b21SYW5nZVNlbGVjdGlvbnMpLmZvckVhY2goaWQgPT4geyBpZiAoIWF2YWlsYWJsZS5oYXMoaWQpKSBkZWxldGUgdGhpcy5jdXN0b21SYW5nZVNlbGVjdGlvbnNbaWRdOyB9KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmN1c3RvbUZpbHRlckdyb3VwcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9uc0tleSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gSWRlbnRpZmllcnMgdGhlIEFQSSByZXR1cm5lZCBmb3IgdGhpcyBwYWdlLiBBIGxlZ2FjeSBibG9jayBpcyBoaWRkZW4gd2hlbiB0aGUgQVBJIHN1cHBsaWVzIGl0LlxyXG4gIGFwaUZpbHRlcklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICBpc0FwaUZpbHRlcihpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFwaUZpbHRlcklkcy5oYXMoaWRlbnRpZmllcik7XHJcbiAgfVxyXG5cclxuICAvLyBicmFuZCAvIGNhdGVnb3J5IC8gY29sbGVjdGlvbiBzaGFyZSBzdGF0ZSB3aXRoIHRoZSBsZWdhY3kgc2lkZWJhciBhbmQgc2VhcmNoIGZpZWxkcy5cclxuICBwcml2YXRlIHN5c3RlbUxpc3QoaWRlbnRpZmllcjogc3RyaW5nKTogQmFzZU1vZGVsW10gfCBudWxsIHtcclxuICAgIGlmIChpZGVudGlmaWVyID09PSAnY2F0ZWdvcnknKSByZXR1cm4gdGhpcy5jYXRlZ29yaWVzO1xyXG4gICAgaWYgKGlkZW50aWZpZXIgPT09ICdjb2xsZWN0aW9uJykgcmV0dXJuIHRoaXMuY29sbGVjdGlvbnM7XHJcbiAgICBpZiAoaWRlbnRpZmllciA9PT0gJ2JyYW5kJykgcmV0dXJuIHRoaXMuYnJhbmRzO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU3lzdGVtTGlzdEZpbHRlcihpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN5c3RlbUxpc3QoaWRlbnRpZmllcikgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICBpc0N1c3RvbUNob2ljZVNlbGVjdGVkKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMuc3lzdGVtTGlzdChpZGVudGlmaWVyKTtcclxuICAgIGlmIChsaXN0KSByZXR1cm4gbGlzdC5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gdmFsdWUgJiYgaXRlbS5zdGF0dXMpO1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tpZGVudGlmaWVyXT8uaW5jbHVkZXModmFsdWUpID8/IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ3VzdG9tQ2hvaWNlKGZpbHRlcjogRmlsdGVyRGVmLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5zeXN0ZW1MaXN0KGZpbHRlci5pZGVudGlmaWVyKTtcclxuICAgIGlmIChsaXN0KSB7XHJcbiAgICAgIGxldCBpdGVtID0gbGlzdC5maW5kKHggPT4geC5pZCA9PT0gdmFsdWUpO1xyXG4gICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAvLyBlLmcuIGEgY2F0ZWdvcnkgb3V0c2lkZSB0aGUgZmVhdHVyZWQgbGlzdDogYWRkIGl0IHNvIGl0IGlzIHNlbGVjdGFibGUgYW5kIHNlYXJjaGFibGVcclxuICAgICAgICBjb25zdCBjaG9pY2UgPSBmaWx0ZXIuY2hvaWNlcz8uZmluZChjID0+IGMudmFsdWUgPT09IHZhbHVlKTtcclxuICAgICAgICBpdGVtID0geyBvcHRpb246IGNob2ljZT8ubGFiZWwgPz8gdmFsdWUsIGlkOiB2YWx1ZSwgaW1nVXJsOiAnJywgc3RhdHVzOiBmYWxzZSB9O1xyXG4gICAgICAgIGxpc3QucHVzaChpdGVtKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFwcGx5RmlsdGVyKGl0ZW0sICdGSUxURVInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl0gPz8gW107XHJcbiAgICAvLyBCT09MRUFOIGlzIGEgeWVzL25vLCBzbyBvbmx5IG9uZSB2YWx1ZSBhdCBhIHRpbWUuXHJcbiAgICBjb25zdCBzaW5nbGUgPSBmaWx0ZXIuY29udHJvbCA9PT0gJ0JPT0xFQU4nO1xyXG4gICAgdGhpcy5jdXN0b21DaG9pY2VTZWxlY3Rpb25zW2ZpbHRlci5pZGVudGlmaWVyXSA9IGN1cnJlbnQuaW5jbHVkZXModmFsdWUpXHJcbiAgICAgID8gY3VycmVudC5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcclxuICAgICAgOiBzaW5nbGUgPyBbdmFsdWVdIDogWy4uLmN1cnJlbnQsIHZhbHVlXTtcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGN1c3RvbVJhbmdlKGlkZW50aWZpZXI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zW2lkZW50aWZpZXJdID8/IHsgbWluOiAnJywgbWF4OiAnJyB9O1xyXG4gIH1cclxuXHJcbiAgc2V0Q3VzdG9tUmFuZ2UoaWRlbnRpZmllcjogc3RyaW5nLCBlZGdlOiAnbWluJyB8ICdtYXgnLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xyXG4gICAgY29uc3QgcmFuZ2UgPSB7IC4uLnRoaXMuY3VzdG9tUmFuZ2UoaWRlbnRpZmllcikgfTtcclxuICAgIHJhbmdlW2VkZ2VdID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbHVlKS50cmltKCk7XHJcbiAgICB0aGlzLmN1c3RvbVJhbmdlU2VsZWN0aW9uc1tpZGVudGlmaWVyXSA9IHJhbmdlO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hpcHMgZm9yIHNlcnZlci1kcml2ZW4gZmlsdGVycywgc2hvd24gbmV4dCB0byB0aGUgbGVnYWN5IG9uZXMuXHJcbiAgZ2V0IHNlbGVjdGVkQ3VzdG9tQ2hpcHMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5jdXN0b21GaWx0ZXJHcm91cHMuZmxhdE1hcChnID0+IGcuZmlsdGVycyk7XHJcbiAgICBjb25zdCBjaGlwczogeyBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyB9W10gPSBbXTtcclxuICAgIGZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICAodGhpcy5jdXN0b21DaG9pY2VTZWxlY3Rpb25zW2ZpbHRlci5pZGVudGlmaWVyXSA/PyBbXSkuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBmaWx0ZXIuY2hvaWNlcz8uZmluZChjID0+IGMudmFsdWUgPT09IHZhbHVlKT8ubGFiZWwgPz8gdmFsdWU7XHJcbiAgICAgICAgY2hpcHMucHVzaCh7IGlkOiBgY3VzdG9tLSR7ZmlsdGVyLmlkZW50aWZpZXJ9LSR7dmFsdWV9YCwgbmFtZTogbGFiZWwsIHR5cGU6ICdjdXN0b20nLCBpZGVudGlmaWVyOiBmaWx0ZXIuaWRlbnRpZmllciwgdmFsdWUgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zW2ZpbHRlci5pZGVudGlmaWVyXTtcclxuICAgICAgaWYgKHJhbmdlICYmIChyYW5nZS5taW4gIT09ICcnIHx8IHJhbmdlLm1heCAhPT0gJycpKSB7XHJcbiAgICAgICAgY2hpcHMucHVzaCh7XHJcbiAgICAgICAgICBpZDogYGN1c3RvbS0ke2ZpbHRlci5pZGVudGlmaWVyfS1yYW5nZWAsXHJcbiAgICAgICAgICBuYW1lOiBgJHtmaWx0ZXIubGFiZWx9OiAke3JhbmdlLm1pbiB8fCBmaWx0ZXIubWluIHx8IDB9IC0gJHtyYW5nZS5tYXggfHwgZmlsdGVyLm1heCB8fCAnYW55J31gLFxyXG4gICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICBpZGVudGlmaWVyOiBmaWx0ZXIuaWRlbnRpZmllclxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjaGlwcztcclxuICB9XHJcblxyXG4gIGdldCBkaXNwbGF5Q2hpcHMoKSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMuZmlsdGVyZWRDaGlwcywgLi4udGhpcy5zZWxlY3RlZEN1c3RvbUNoaXBzXTtcclxuICB9XHJcblxyXG4gIGR5bmFtaWNQcmljZVJhbmdlKG1pblByaWNlOiBudW1iZXIsIG1heFByaWNlOiBudW1iZXIpIHtcclxuICAgIHRoaXMucHJpY2VSYW5nZXMgPSBbXTtcclxuICAgIGNvbnN0IHJhbmdlID0gbWF4UHJpY2UgLSBtaW5QcmljZTtcclxuICAgIGNvbnN0IHN0ZXAgPSByYW5nZSAvIDU7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGFydCA9IE1hdGgucm91bmQoKG1pblByaWNlICsgaSAqIHN0ZXApIC8gMTAwKSAqIDEwMDtcclxuICAgICAgY29uc3QgZW5kID0gaSA9PT0gNFxyXG4gICAgICAgID8gTWF0aC5yb3VuZChtYXhQcmljZSAvIDEwMCkgKiAxMDBcclxuICAgICAgICA6IE1hdGgucm91bmQoKG1pblByaWNlICsgKGkgKyAxKSAqIHN0ZXApIC8gMTAwKSAqIDEwMDtcclxuICAgICAgdGhpcy5wcmljZVJhbmdlcy5wdXNoKHsgbGFiZWw6IGDigrkke3N0YXJ0fSAtIOKCuSR7ZW5kfWAsIG1pbjogc3RhcnQsIG1heDogZW5kLCBzZWxlY3RlZDogZmFsc2UgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgc2VsZWN0T3B0aW9uKGZpbHRlcjogYW55LCBldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICAvLyBQcmV2ZW50IGNsb3NpbmcgdHdpY2VcclxuICAgIHRoaXMuc29ydEJ5ID0gZmlsdGVyLnZhbHVlO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcih7IHZhbHVlOiBmaWx0ZXIudmFsdWUgfSwgJ1NPUlQnKTtcclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZE5hbWUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5maWx0ZXJpbmdBcnJheS5maW5kKGYgPT4gZi52YWx1ZSA9PT0gdGhpcy5zb3J0QnkpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWQubmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUHJvZHVjdExpc3RTY3JvbGwoKSB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMubGlzdFNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghZWwgfHwgdGhpcy5pc0xpc3RMb2FkaW5nIHx8IHRoaXMuaXNBbGxMaXN0TG9hZGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdGhyZXNob2xkID0gMTUwOyAvLyBJbmNyZWFzZWQgdGhyZXNob2xkIGZvciBzbW9vdGhlciBsb2FkaW5nXHJcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IC0gZWwuc2Nyb2xsVG9wIC0gZWwuY2xpZW50SGVpZ2h0IDwgdGhyZXNob2xkKSB7XHJcbiAgICAgIHRoaXMubG9hZE1vcmVQcm9kdWN0c1RvTGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZE1vcmVQcm9kdWN0c1RvTGlzdCgpIHtcclxuICAgIGlmICh0aGlzLmlzTGlzdExvYWRpbmcgfHwgdGhpcy5pc0FsbExpc3RMb2FkZWQpIHJldHVybjtcclxuICAgIHRoaXMuaXNMaXN0TG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VObysrO1xyXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhICYmIHRoaXMucmVzcG9uc2VEYXRhLmxlbmd0aCA+PSB0aGlzLnRvdGFsQ291bnQpIHtcclxuICAgICAgdGhpcy5pc0FsbExpc3RMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzTGlzdExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRGaWx0ZXJlZFByb2R1Y3QoXHJcbiAgICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKCh4KSA9PiB4LnN0YXR1cykubWFwKCh4KSA9PiB4LmlkKSxcclxuICAgICAgdGhpcy5jYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5zdGF0dXMpLm1hcCgoeCkgPT4geC5pZCksXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCxcclxuICAgICAgdGhpcy5wcmljaW5nTWluLFxyXG4gICAgICB0aGlzLnByaWNpbmdNYXgsXHJcbiAgICAgIHRoaXMubWluUmF0aW5nLFxyXG4gICAgICB0aGlzLm1heFJhdGluZyxcclxuICAgICAgdGhpcy5zb3J0QnkgPz8gXCJcIixcclxuICAgICAgdGhpcy5wYWdlTm8gLSAxLFxyXG4gICAgICB0aGlzLnNpemUsXHJcbiAgICAgIHRoaXMuYnJhbmRzLmZpbHRlcigoeCkgPT4geC5zdGF0dXMpLm1hcCgoeCkgPT4geC5pZCksXHJcbiAgICAgIHRoaXMuY3VzdG9tU2VhcmNoT3B0aW9uc1xyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSBbLi4uKHRoaXMucmVzcG9uc2VEYXRhID8/IFtdKSwgLi4uKHJlc3BvbnNlLmRhdGEgPz8gW10pXTtcclxuICAgICAgdGhpcy50b3RhbENvdW50ID0gcmVzcG9uc2UuY291bnQ7XHJcbiAgICAgIHRoaXMuaXNBbGxMaXN0TG9hZGVkID0gKHRoaXMucmVzcG9uc2VEYXRhPy5sZW5ndGggPz8gMCkgPj0gdGhpcy50b3RhbENvdW50O1xyXG4gICAgICB0aGlzLmlzTGlzdExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sIF9lcnIgPT4ge1xyXG4gICAgICB0aGlzLmlzTGlzdExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGVjb21Db25maWdzOiBhbnk7XHJcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RWNvbW1lcmNlQ29uZmlncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5lY29tQ29uZmlncyA9IHJlcz8uZGF0YVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIFdoZXRoZXIgVHJ5IGF0IEhvbWUgLyBWaWRlbyBDYWxsIGFyZSBvZmZlcmVkIGlzIGFuIEFwcG9pbnRtZW50LWFwcCBzZXR0aW5nXHJcbiAgLy8gKGhvbWVWaXNpdFByb2R1Y3RzRW5hYmxlZC92aWRlb0NhbGxQcm9kdWN0c0VuYWJsZWQpLCBub3QgYSB3ZWJzaXRlLXNldHRpbmdzIHRvZ2dsZS5cclxuICBhcHBvaW50bWVudFNldHRpbmdzOiBhbnkgPSBudWxsO1xyXG4gIGdldEFwcG9pbnRtZW50U2V0dGluZ3MoKSB7XHJcbiAgICBjb25zdCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyAnJztcclxuICAgIGlmICghYnVzaW5lc3NJZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRCdXNpbmVzc0FwcG9pbnRtZW50U2V0dGluZ3MoYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmFwcG9pbnRtZW50U2V0dGluZ3MgPSByZXM7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICAgIC8vIE5vbi1mYXRhbCAtIFRyeSBhdCBIb21lIGJ1dHRvbiBqdXN0IHN0YXlzIGhpZGRlbi5cclxuICAgIH0pO1xyXG4gIH1cclxuICB0b1Nob3dJbkpld2VsbGVyeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIElzRWNvbW1lcmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNNYXRlcmlhbEJhc2VkUHJpY2luZyA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZ2V0RWNvbW1lcmNlQ29uZmlncygpO1xyXG4gICAgdGhpcy5nZXRBcHBvaW50bWVudFNldHRpbmdzKCk7XHJcbiAgICBpZiAod2luZG93Py5sb2NhdGlvbj8ub3JpZ2luPy5pbmNsdWRlcygnY2FyYXRsYW5lJykgfHwgd2luZG93Py5sb2NhdGlvbj8ub3JpZ2luPy5pbmNsdWRlcygnb3JyYScpKSB7XHJcbiAgICAgIHRoaXMudG9TaG93SW5KZXdlbGxlcnkgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc01hdGVyaWFsQmFzZWRQcmljaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzTWF0ZXJpYWxCYXNlZFByaWNpbmcnKSA9PT0gJ3RydWUnO1xyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBpY29uOiBcInBpIHBpLXNob3BwaW5nLWNhcnRcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jYXJ0J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGljb246IFwicGkgcGktaG9tZVwiLFxyXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmRhdGE/LmNvbnRlbnQ7XHJcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xyXG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdO1xyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnNob3dMb2FkaW5nU2NyZWVuLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSByZXNwb25zZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5Jc0Vjb21tZXJjZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwid2Vic2l0ZVR5cGVcIikgIT0gJ1NUQVRJQycgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAvLyB0aGlzLmdldEFsbENhdGVnb3JpZXMoKTtcclxuICAgIC8vIHRoaXMuZ2V0QWxsQ29sbGVjdGlvbnMoKTtcclxuICAgIHRoaXMubWluUHJvZHVjdFByaWNlID0gdGhpcy5wcmljaW5nTWluID0gdGhpcy5kYXRhPy5zdHlsZXMubWluUHJpY2UgPz8gMDtcclxuICAgIHRoaXMubWF4UHJvZHVjdFByaWNlID0gdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5kYXRhPy5zdHlsZXMubWF4UHJpY2UgPz8gMzAwMDA7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wic2VhcmNoVHh0XCJdO1xyXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHFQYXJhbTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHFQYXJhbVtcInNlYXJjaFR4dFwiXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFRleHQpXHJcbiAgICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ1NFQVJDSCc7XHJcblxyXG4gICAgICB0aGlzLnBhZ2VObyA9IHFQYXJhbVtcInBhZ2VOb1wiXSA/IE51bWJlcihxUGFyYW1bXCJwYWdlTm9cIl0pIDogMTtcclxuICAgICAgdGhpcy5zb3J0QnkgPSBxUGFyYW1bXCJzb3J0aW5nXCJdID8/IFwiXCI7XHJcbiAgICAgIHRoaXMucHJpY2luZ01pbiA9IGlzTmFOKE51bWJlcihxUGFyYW1bXCJtaW5QcmljZVwiXSkpID8gMCA6IE51bWJlcihxUGFyYW1bXCJtaW5QcmljZVwiXSk7XHJcbiAgICAgIHRoaXMucHJpY2luZ01heCA9IGlzTmFOKE51bWJlcihxUGFyYW1bXCJtYXhQcmljZVwiXSkpID8gMCA6IE51bWJlcihxUGFyYW1bXCJtYXhQcmljZVwiXSk7XHJcbiAgICAgIC8vIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1bXCJjYXRlZ29yeVwiXSwgcVBhcmFtW1wiY29sbGVjdGlvbnNcIl0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMF07XHJcbiAgICB0aGlzLmdldENhdGVnb3JpZXNBbmRDb2xsZWN0aW9uKCk7XHJcblxyXG4gICAgLy8gdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBbmFseXRpY3MoKSB7XHJcbiAgICBsZXQgYW5hbHl0aWNzRXZlbnQ6IGFueSA9IHt9XHJcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydTRUFSQ0gnXSA9IHRoaXMuc2VhcmNoVGV4dFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHJpY2luZ01pbikge1xyXG4gICAgICBhbmFseXRpY3NFdmVudFsnTUlOX1BSSUNFJ10gPSB0aGlzLnByaWNpbmdNaW47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcmljaW5nTWF4KSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydNQVhfUFJJQ0UnXSA9IHRoaXMucHJpY2luZ01heDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3J0QnkpIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ1NPUlRfQlknXSA9IHRoaXMuc29ydEJ5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1pblJhdGluZykge1xyXG4gICAgICBhbmFseXRpY3NFdmVudFsnTUlOX1JBVElORyddID0gdGhpcy5taW5SYXRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWF4UmF0aW5nKSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydNQVhfUkFUSU5HJ10gPSB0aGlzLm1heFJhdGluZztcclxuICAgIH1cclxuXHJcbiAgICBhbmFseXRpY3NFdmVudFsnQ0FURUdPUklFUyddID0gdGhpcy5jYXRlZ29yaWVzLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKVxyXG5cclxuICAgIGFuYWx5dGljc0V2ZW50WydDT0xMRUNUSU9OUyddID0gdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4geC5pZCk7XHJcblxyXG4gICAgY29uc3QgY3VzdG9tRmlsdGVycyA9IHRoaXMuY3VzdG9tU2VhcmNoT3B0aW9ucy5jdXN0b21GaWVsZEZpbHRlcnM7XHJcbiAgICBpZiAoY3VzdG9tRmlsdGVycy5sZW5ndGgpIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ0NVU1RPTV9GSUxURVJTJ10gPSBjdXN0b21GaWx0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zdGFydE5ld0NvbnRleHQoYW5hbHl0aWNzRXZlbnQsIHRoaXMubGF0ZXN0QW5hbHlpY3NFdmVudCk7XHJcbiAgfVxyXG5cclxuICBnZXRDYXRlZ29yaWVzQW5kQ29sbGVjdGlvbigpIHtcclxuICAgIGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDb2xsZWN0aW9ucygpLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvbGxlY3Rpb25zIGZhaWxlZFwiLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTsgICAvLyBmYWxsYmFjayBlbXB0eSBhcnJheVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ2F0ZWdvcmllcygpLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhdGVnb3JpZXMgZmFpbGVkXCIsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pOyAgIC8vIGZhbGxiYWNrIGVtcHR5IGFycmF5XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxCcmFuZHMoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJCcmFuZHMgZmFpbGVkXCIsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pOyAgIC8vIGZhbGxiYWNrIGVtcHR5IGFycmF5XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgXSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gcmVzWzFdLmZpbHRlcigoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnkuZmVhdHVyZWRDb2xsZWN0aW9uIHx8IHRydWUpLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNhdGVnb3J5LmNhdGVnb3J5TmFtZSwgaWQ6IGNhdGVnb3J5LmNhdGVnb3J5SWQsIGltZ1VybDogY2F0ZWdvcnkuaW1nVXJsPy5bMF0sIHN0YXR1czogZmFsc2UsIHNsdWc6IGNhdGVnb3J5LnNsdWdOYW1lIH0gfSk7XHJcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IHJlc1swXS5maWx0ZXIoKGNvbGxlY3Rpb246IGFueSkgPT4gY29sbGVjdGlvbi5mZWF0dXJlZENhdGVnb3J5IHx8IHRydWUpLm1hcCgoY29sbGVjdGlvbjogYW55KSA9PiB7IHJldHVybiB7IG9wdGlvbjogY29sbGVjdGlvbi5jb2xsZWN0aW9uTmFtZSwgaWQ6IGNvbGxlY3Rpb24uY29sbGVjdGlvbklkLCBzdGF0dXM6IGZhbHNlLCBzbHVnOiBjb2xsZWN0aW9uLnNsdWdOYW1lIH0gfSk7XHJcbiAgICAgICAgdGhpcy5icmFuZHMgPSAocmVzWzJdID8/IFtdKS5tYXAoKGJyYW5kOiBhbnkpID0+IHsgcmV0dXJuIHsgb3B0aW9uOiBicmFuZC5icmFuZE5hbWUsIGlkOiBicmFuZC5icmFuZElkLCBpbWdVcmw6IGJyYW5kLmltZ1VybD8uWzBdLCBzdGF0dXM6IGZhbHNlIH0gfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHFQYXJhbUJyYW5kID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImJyYW5kXCJdO1xyXG4gICAgICAgIGNvbnN0IHsgY2F0ZWdvcnksIGNvbGxlY3Rpb25zIH0gPSB0aGlzLnJlc29sdmVMaXN0Um91dGVQYXJhbXMoKTtcclxuICAgICAgICB0aGlzLmxpc3RzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxhc3RMaXN0UGF0aCA9IHRoaXMuY3VycmVudExpc3RQYXRoKCk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKGNhdGVnb3J5LCBjb2xsZWN0aW9ucywgcVBhcmFtQnJhbmQpO1xyXG5cclxuICAgICAgICAvLyAvbGlzdC9hIC0+IC9saXN0L2Iga2VlcHMgdGhpcyBjb21wb25lbnQgYWxpdmUsIHNvIHJlLWFwcGx5IHdoZW4gdGhlIHBhdGggY2hhbmdlcy5cclxuICAgICAgICB0aGlzLmxpc3RQYXRoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMubGlzdFBhdGhTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHNcclxuICAgICAgICAgIC5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuY3VycmVudExpc3RQYXRoKCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0c0xvYWRlZCB8fCBwYXRoID09PSB0aGlzLmxhc3RMaXN0UGF0aCB8fCAhcGF0aC5zdGFydHNXaXRoKCdsaXN0JykpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5sYXN0TGlzdFBhdGggPSBwYXRoO1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZUxpc3RSb3V0ZVBhcmFtcygpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0oXHJcbiAgICAgICAgICAgICAgcmVzb2x2ZWQuY2F0ZWdvcnksXHJcbiAgICAgICAgICAgICAgcmVzb2x2ZWQuY29sbGVjdGlvbnMsXHJcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImJyYW5kXCJdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVySXRlbUxpc3QoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RzTG9hZGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0TGlzdFBhdGggPSAnJztcclxuICBwcml2YXRlIGxpc3RQYXRoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvLyBQYXRoIHBhcnQgb2YgdGhlIFVSTCBmcm9tIGBsaXN0YCBvbndhcmRzLCB1c2VkIHRvIGRldGVjdCAvbGlzdC9hIC0+IC9saXN0L2IgbmF2aWdhdGlvbi5cclxuICBwcml2YXRlIGN1cnJlbnRMaXN0UGF0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhcnNlTGlzdFBhdGgod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKS5qb2luKCcvJykgPyAnbGlzdC8nICsgcGFyc2VMaXN0UGF0aCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpLmpvaW4oJy8nKSA6ICdsaXN0JztcclxuICB9XHJcblxyXG4gIC8vIENhdGVnb3J5L2NvbGxlY3Rpb24gZm9yIHRoZSBwYWdlOiBwYXRoIHNlZ21lbnRzICgvbGlzdC97Y2F0ZWdvcnl9L3tjb2xsZWN0aW9ufSkgZmlyc3QsIHRoZW4gdGhlXHJcbiAgLy8gbGVnYWN5ID9jYXRlZ29yeT0gLyA/Y29sbGVjdGlvbnM9IHF1ZXJ5IHBhcmFtcyBzbyBvbGQgbGlua3Mga2VlcCB3b3JraW5nLlxyXG4gIHByaXZhdGUgcmVzb2x2ZUxpc3RSb3V0ZVBhcmFtcygpOiB7IGNhdGVnb3J5OiBhbnksIGNvbGxlY3Rpb25zOiBhbnkgfSB7XHJcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhcnNlTGlzdFBhdGgod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcclxuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApXHJcbiAgICAgIHJldHVybiB7IGNhdGVnb3J5OiBxdWVyeVBhcmFtc1tcImNhdGVnb3J5XCJdLCBjb2xsZWN0aW9uczogcXVlcnlQYXJhbXNbXCJjb2xsZWN0aW9uc1wiXSB9O1xyXG5cclxuICAgIGNvbnN0IG1hdGNoZXMgPSAobGlzdDogQmFzZU1vZGVsW10sIHNlZ21lbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCB0b2tlbiA9IHNsdWdGcm9tTmFtZShzZWdtZW50KTtcclxuICAgICAgcmV0dXJuIGxpc3Quc29tZSgoaXRlbSkgPT5cclxuICAgICAgICBpdGVtLnNsdWc/LnRvTG93ZXJDYXNlKCkgPT09IHRva2VuIHx8XHJcbiAgICAgICAgc2x1Z0Zyb21OYW1lKGl0ZW0ub3B0aW9uKSA9PT0gdG9rZW4pO1xyXG4gICAgfTtcclxuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPj0gMilcclxuICAgICAgcmV0dXJuIHsgY2F0ZWdvcnk6IHNlZ21lbnRzWzBdLCBjb2xsZWN0aW9uczogc2VnbWVudHNbMV0gfTtcclxuXHJcbiAgICAvLyBPbmUgc2VnbWVudCBpcyBlaXRoZXIgYSBjYXRlZ29yeSBvciBhIGNvbGxlY3Rpb24uIENhdGVnb3J5IGZpcnN0OyBhIHNlZ21lbnQgdGhhdCBtYXRjaGVzXHJcbiAgICAvLyBuZWl0aGVyIChlLmcuIGEgY2F0ZWdvcnkgb3V0c2lkZSB0aGUgZmVhdHVyZWQgbGlzdCkgZ29lcyB0byB0aGUgc2VydmVyIGFzIGEgY2F0ZWdvcnkgc2x1Zy5cclxuICAgIGNvbnN0IFtzZWdtZW50XSA9IHNlZ21lbnRzO1xyXG4gICAgaWYgKCFtYXRjaGVzKHRoaXMuY2F0ZWdvcmllcywgc2VnbWVudCkgJiYgbWF0Y2hlcyh0aGlzLmNvbGxlY3Rpb25zLCBzZWdtZW50KSlcclxuICAgICAgcmV0dXJuIHsgY2F0ZWdvcnk6IHVuZGVmaW5lZCwgY29sbGVjdGlvbnM6IHNlZ21lbnQgfTtcclxuICAgIHJldHVybiB7IGNhdGVnb3J5OiBzZWdtZW50LCBjb2xsZWN0aW9uczogdW5kZWZpbmVkIH07XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcygpIHtcclxuICAgIGNvbnN0IGNoaXBzOiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9W10gPSBbXTtcclxuICAgIGlmICh0aGlzLmNhdGVnb3JpZXMpIHtcclxuICAgICAgY2hpcHMucHVzaChcclxuICAgICAgICAuLi50aGlzLmNhdGVnb3JpZXMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+ICh7XHJcbiAgICAgICAgICBpZDogeC5pZCxcclxuICAgICAgICAgIG5hbWU6IHgub3B0aW9uXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9ucykge1xyXG4gICAgICBjaGlwcy5wdXNoKFxyXG4gICAgICAgIC4uLnRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+ICh7XHJcbiAgICAgICAgICBpZDogeC5pZCxcclxuICAgICAgICAgIG5hbWU6IHgub3B0aW9uXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5icmFuZHMpIHtcclxuICAgICAgY2hpcHMucHVzaChcclxuICAgICAgICAuLi50aGlzLmJyYW5kcy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4gKHtcclxuICAgICAgICAgIGlkOiB4LmlkLFxyXG4gICAgICAgICAgbmFtZTogeC5vcHRpb25cclxuICAgICAgICB9KSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlwcztcclxuICB9XHJcblxyXG4gIC8vIENvbXB1dGVkIGdldHRlciBmb3Igc2VsZWN0ZWQgcHJpY2UgcmFuZ2UgY2hpcHNcclxuICBnZXQgc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmljZVJhbmdlc1xyXG4gICAgICAuZmlsdGVyKHByID0+IHByLnNlbGVjdGVkKVxyXG4gICAgICAubWFwKHByID0+ICh7XHJcbiAgICAgICAgaWQ6ICdwcmljZS0nICsgcHIubWluICsgJy0nICsgcHIubWF4LFxyXG4gICAgICAgIG5hbWU6IHByLmxhYmVsLFxyXG4gICAgICAgIHR5cGU6ICdwcmljZSdcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkUmF0aW5nQ2hpcHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yYXRpbmdPcHRpb25zXHJcbiAgICAgIC5maWx0ZXIocmF0aW5nID0+IHJhdGluZy5zZWxlY3RlZClcclxuICAgICAgLm1hcChyYXRpbmcgPT4gKHtcclxuICAgICAgICBpZDogJ3JhdGluZy0nICsgcmF0aW5nLm1pbiArICctJyArIHJhdGluZy5tYXgsXHJcbiAgICAgICAgbmFtZTogcmF0aW5nLmxhYmVsLFxyXG4gICAgICAgIHR5cGU6ICdyYXRpbmcnXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldCBhbGxBY3RpdmVDaGlwcygpIHtcclxuICAgIGxldCBkYXRhID0gW1xyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcclxuICAgIF07XHJcbiAgICByZXR1cm4gZGF0YVxyXG4gIH1cclxuXHJcbiAgZ2V0QWxsQ2F0ZWdvcmllcygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ2F0ZWdvcmllcygpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5jYXRlZ29yaWVzID0gcmVzcG9uc2UuZmlsdGVyKChjYXRlZ29yeTogYW55KSA9PiBjYXRlZ29yeS5mZWF0dXJlZENvbGxlY3Rpb24gfHwgdHJ1ZSkubWFwKChjYXRlZ29yeTogYW55KSA9PiB7IHJldHVybiB7IG9wdGlvbjogY2F0ZWdvcnkuY2F0ZWdvcnlOYW1lLCBpZDogY2F0ZWdvcnkuY2F0ZWdvcnlJZCwgaW1nVXJsOiBjYXRlZ29yeS5pbWdVcmw/LlswXSwgc3RhdHVzOiBmYWxzZSwgc2x1ZzogY2F0ZWdvcnkuc2x1Z05hbWUgfSB9KTtcclxuICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XHJcbiAgICAgIGNvbnN0IHFQYXJhbUNhdGVnb3J5ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNhdGVnb3J5XCJdO1xyXG4gICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtQ2F0ZWdvcnksIHFQYXJhbUNvbGxlY3Rpb25zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsQ29sbGVjdGlvbnMoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbENvbGxlY3Rpb25zKCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmNvbGxlY3Rpb25zID0gcmVzcG9uc2UuZmlsdGVyKChjb2xsZWN0aW9uOiBhbnkpID0+IGNvbGxlY3Rpb24uZmVhdHVyZWRDYXRlZ29yeSB8fCB0cnVlKS5tYXAoKGNvbGxlY3Rpb246IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUsIGlkOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25JZCwgc3RhdHVzOiBmYWxzZSwgc2x1ZzogY29sbGVjdGlvbi5zbHVnTmFtZSB9IH0pO1xyXG4gICAgICBjb25zdCBxUGFyYW1Db2xsZWN0aW9ucyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjb2xsZWN0aW9uc1wiXTtcclxuICAgICAgY29uc3QgcVBhcmFtQ2F0ZWdvcnkgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY2F0ZWdvcnlcIl07XHJcbiAgICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1DYXRlZ29yeSwgcVBhcmFtQ29sbGVjdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0Q2FydFdpc2hsaXN0UHJvcGVydGllcygpIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5VU0VSX0NBUlQgPSBjYXJ0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW10gfHwgW107XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/LmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcclxuICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QuaXRlbUlkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudC52YXJpYW50SW1hZ2VzID8/IFtdO1xyXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcldoaXNobGlzdCgpLnRoZW4oKHdpc2hsaXN0UmVzcG9uc2UpID0+IHtcclxuICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB3aGlzbGlzdERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdIHx8IFtdO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhPy5mb3JFYWNoKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdC5pdGVtSWQpIHtcclxuICAgICAgICAgICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCA9IHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5bMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50Py52YXJpYW50SW1hZ2VzID8/IFtdO1xyXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocUNhdGVnb3JpZXM6IGFueSwgcUNvbGxlY3Rpb25zOiBhbnksIHFCcmFuZHM/OiBhbnkpIHtcclxuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBxQ2F0ZWdvcmllcz8uc3BsaXQoXCIrXCIpPy5tYXAoKGNhdGVnb3J5OiBzdHJpbmcpID0+IGNhdGVnb3J5LnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGNhdGVnb3J5OiBzdHJpbmcpID0+IGNhdGVnb3J5Lmxlbmd0aCA+IDApO1xyXG4gICAgY29uc3QgY29sbGVjdGlvbnMgPSBxQ29sbGVjdGlvbnM/LnNwbGl0KFwiK1wiKT8ubWFwKChjb2xsZWN0aW9uOiBzdHJpbmcpID0+IGNvbGxlY3Rpb24ucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcigoY29sbGVjdGlvbjogc3RyaW5nKSA9PiBjb2xsZWN0aW9uLmxlbmd0aCA+IDApO1xyXG4gICAgY29uc3QgYnJhbmRzID0gcUJyYW5kcz8uc3BsaXQoXCIrXCIpPy5tYXAoKGJyYW5kOiBzdHJpbmcpID0+IGJyYW5kLnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGJyYW5kOiBzdHJpbmcpID0+IGJyYW5kLmxlbmd0aCA+IDApO1xyXG5cclxuICAgIGlmICgoY2F0ZWdvcmllcz8ubGVuZ3RoID8/IDApID4gMCB8fCAoY29sbGVjdGlvbnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHwgKGJyYW5kcz8ubGVuZ3RoID8/IDApID4gMClcclxuICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ0ZJTFRFUl9BUFBMSUVEJztcclxuXHJcbiAgICAvLyBBIFVSTCB0b2tlbiBpcyBhIGJhY2tlbmQgc2x1Z05hbWUgKGBtZW5zLXdlYXJgKSBvciB0aGUgb2xkZXIgbmFtZSBmb3JtIChgTWVuc19XZWFyYCkuXHJcbiAgICAvLyBUaGUgbG9hZGVkIGxpc3QgKGZlYXR1cmVkIGNhdGVnb3JpZXMsIGNvbGxlY3Rpb25zKSBtYXkgbm90IGNhcnJ5IGBzbHVnTmFtZWAsIHNvIHRoZSBuYW1lIGlzXHJcbiAgICAvLyBzbHVnaWZpZWQgdG9vOiBgbWVucy13ZWFyYCBtdXN0IG1hdGNoIGEgY2F0ZWdvcnkgbmFtZWQgXCJNZW5zIFdlYXJcIi5cclxuICAgIGNvbnN0IHRvU2x1ZyA9ICh0b2tlbjogc3RyaW5nKSA9PiBzbHVnRnJvbU5hbWUodG9rZW4pO1xyXG4gICAgY29uc3QgbWF0Y2hlc1Rva2VuID0gKGl0ZW06IEJhc2VNb2RlbCwgdG9rZW5zOiBzdHJpbmdbXSkgPT5cclxuICAgICAgdG9rZW5zLnNvbWUoKHRva2VuKSA9PlxyXG4gICAgICAgIChpdGVtLnNsdWcgJiYgaXRlbS5zbHVnLnRvTG93ZXJDYXNlKCkgPT09IHRvU2x1Zyh0b2tlbikpIHx8XHJcbiAgICAgICAgc2x1Z0Zyb21OYW1lKGl0ZW0ub3B0aW9uKSA9PT0gdG9TbHVnKHRva2VuKSk7XHJcblxyXG4gICAgdGhpcy5jYXRlZ29yaWVzPy5mb3JFYWNoKChjYXRlZ29yeSkgPT4ge1xyXG4gICAgICBjYXRlZ29yeS5zdGF0dXMgPSBtYXRjaGVzVG9rZW4oY2F0ZWdvcnksIGNhdGVnb3JpZXMgPz8gW10pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25zPy5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbGxlY3Rpb24uc3RhdHVzID0gbWF0Y2hlc1Rva2VuKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25zID8/IFtdKTtcclxuICAgIH0pO1xyXG4gICAgLy8gVG9rZW5zIHRoYXQgbWF0Y2hlZCBub3RoaW5nIGluIHRoZSBsb2FkZWQgbGlzdHMgZ28gdG8gdGhlIHNlcnZlciBhcyBzbHVncy4gQW4gdW5rbm93biBzbHVnXHJcbiAgICAvLyByZXR1cm5zIG5vIHJvd3MsIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBlbXB0eSBzdGF0ZSBmb3IgYSBiYWQgbGluay5cclxuICAgIHRoaXMudXJsQ2F0ZWdvcnlTbHVncyA9IChjYXRlZ29yaWVzID8/IFtdKVxyXG4gICAgICAuZmlsdGVyKCh0b2tlbjogc3RyaW5nKSA9PiAhdGhpcy5jYXRlZ29yaWVzLnNvbWUoKGMpID0+IG1hdGNoZXNUb2tlbihjLCBbdG9rZW5dKSkpXHJcbiAgICAgIC5tYXAodG9TbHVnKTtcclxuICAgIHRoaXMudXJsQ29sbGVjdGlvblNsdWdzID0gKGNvbGxlY3Rpb25zID8/IFtdKVxyXG4gICAgICAuZmlsdGVyKCh0b2tlbjogc3RyaW5nKSA9PiAhdGhpcy5jb2xsZWN0aW9ucy5zb21lKChjKSA9PiBtYXRjaGVzVG9rZW4oYywgW3Rva2VuXSkpKVxyXG4gICAgICAubWFwKHRvU2x1Zyk7XHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnNLZXkgPSBudWxsO1xyXG4gICAgdGhpcy5icmFuZHM/LmZvckVhY2goKGJyYW5kKSA9PiB7XHJcbiAgICAgIGJyYW5kLnN0YXR1cyA9IGJyYW5kcz8uaW5jbHVkZXMoYnJhbmQ/Lm9wdGlvbj8udG9Mb3dlckNhc2UoKSkgPz8gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICBdO1xyXG4gICAgLy8gRE8gTk9UIHJlYnVpbGQgZmlsdGVyTGlzdCBoZXJlISAoQ2hpcHMgd2lsbCBhdXRvLXVwZGF0ZSBmcm9tIHN0YXR1cyBhcnJheXMgdmlhIHRoZSBnZXR0ZXIuKVxyXG4gICAgdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRmlsdGVyKGZpbHRlcjogYW55KSB7XHJcbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgIGlmIChmaWx0ZXIudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl0gPVxyXG4gICAgICAgICAgKHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl0gPz8gW10pLmZpbHRlcih2ID0+IHYgIT09IGZpbHRlci52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zW2ZpbHRlci5pZGVudGlmaWVyXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdwcmljZScpIHtcclxuICAgICAgLy8gRGVzZWxlY3QgdGhpcyBwcmljZSByYW5nZSBhbmQgdHJpZ2dlciBmaWx0ZXJcclxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5wcmljZVJhbmdlcy5maW5kSW5kZXgoXHJcbiAgICAgICAgcHIgPT4gZmlsdGVyLmlkID09PSAncHJpY2UtJyArIHByLm1pbiArICctJyArIHByLm1heFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLnByaWNlUmFuZ2VzW2lkeF0uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9uUHJpY2VSYW5nZUNoYW5nZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdyYXRpbmcnKSB7XHJcbiAgICAgIGNvbnN0IHJhdGluZyA9IHRoaXMucmF0aW5nT3B0aW9ucy5maW5kKHIgPT4gZmlsdGVyLmlkID09PSAncmF0aW5nLScgKyByLm1pbiArICctJyArIHIubWF4KTtcclxuICAgICAgaWYgKHJhdGluZykge1xyXG4gICAgICAgIHJhdGluZy5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3RlZFJhdGluZ3MgPSB0aGlzLnJhdGluZ09wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnNlbGVjdGVkKTtcclxuICAgICAgdGhpcy5taW5SYXRpbmcgPSBzZWxlY3RlZFJhdGluZ3MubGVuZ3RoID8gTWF0aC5taW4oLi4uc2VsZWN0ZWRSYXRpbmdzLm1hcCgoaXRlbSkgPT4gaXRlbS5taW4pKSA6IDA7XHJcbiAgICAgIHRoaXMubWF4UmF0aW5nID0gc2VsZWN0ZWRSYXRpbmdzLmxlbmd0aCA/IE1hdGgubWF4KC4uLnNlbGVjdGVkUmF0aW5ncy5tYXAoKGl0ZW0pID0+IGl0ZW0ubWF4KSkgOiAwO1xyXG5cclxuICAgICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xyXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcclxuICAgICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcclxuICAgICAgXTtcclxuICAgICAgdGhpcy5wYWdlTm8gPSAxO1xyXG4gICAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5ID8/IFwiXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXNzdW1lIHJlbWFpbmluZyBjaGlwcyBhcmUgY2F0ZWdvcmllcyBvciBjb2xsZWN0aW9uc1xyXG4gICAgLy8gUmVtb3ZlIHNlbGVjdGlvbiBieSBpZFxyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcmllcykge1xyXG4gICAgICBjb25zdCBjYXQgPSB0aGlzLmNhdGVnb3JpZXMuZmluZChjYXQgPT4gY2F0LmlkID09PSBmaWx0ZXIuaWQpO1xyXG4gICAgICBpZiAoY2F0KSBjYXQuc3RhdHVzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9ucykge1xyXG4gICAgICBjb25zdCBjb2xsID0gdGhpcy5jb2xsZWN0aW9ucy5maW5kKGNvbGwgPT4gY29sbC5pZCA9PT0gZmlsdGVyLmlkKTtcclxuICAgICAgaWYgKGNvbGwpIGNvbGwuc3RhdHVzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5icmFuZHMpIHtcclxuICAgICAgY29uc3QgYnJhbmQgPSB0aGlzLmJyYW5kcy5maW5kKGJyYW5kID0+IGJyYW5kLmlkID09PSBmaWx0ZXIuaWQpO1xyXG4gICAgICBpZiAoYnJhbmQpIGJyYW5kLnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcclxuICAgIF07XHJcbiAgICB0aGlzLnBhZ2VObyA9IDE7XHJcbiAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5ID8/IFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlQcm9kdWN0V2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHlsZXM/LnRoZW1lID09PSB0aGlzLnRoZW1lLlRoZW1lMSB8fFxyXG4gICAgICAodGhpcy5zY3JlZW5XaWR0aCA8IDQ3NSAmJiB0aGlzLnN0eWxlcz8udGhlbWUgPT0gdGhpcy50aGVtZS5UaGVtZTIpXHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0V2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zY3JlZW5XaWR0aCA+IDQ3NSA/ICh0aGlzLnNjcmVlbldpZHRoIDwgMTAyNSA/ICcyNSUnIDogJ2NhbGMoJyArICgoMTAwIC8gKHRoaXMuc3R5bGVzPy5lbGVtZW50SW5Sb3cgfHwgNCkpKSArICclKScpIDogKHRoaXMuc3R5bGVzPy5tb2JpbGVDb2x1bW4gPT09IDEgPyAnOTglJyA6ICc0OCUnKVxyXG4gIH1cclxuXHJcbiAgcHJvY2VlZFRvUHJvZHVjdERlc2MocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgY29uc3Qgc2x1ZyA9IHByb2R1Y3Quc2x1Z2lmaWVkTmFtZSB8fCB0aGlzLnRvU2x1Zyhwcm9kdWN0Lm5hbWUpO1xyXG4gICAgaWYgKCFzbHVnKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydkZXRhaWxzJywgc2x1Z10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1NsdWcoaW5wdXQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghaW5wdXQpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IG5vV2hpdGVzcGFjZSA9IGlucHV0LnJlcGxhY2UoL1xccysvZywgJy0nKTtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub1doaXRlc3BhY2Uubm9ybWFsaXplKCdORkQnKTtcclxuICAgIGNvbnN0IHNsdWcgPSBub3JtYWxpemVkLnJlcGxhY2UoL1teXFx3LV0vZywgJycpO1xyXG5cclxuICAgIHJldHVybiBzbHVnXHJcbiAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIC5yZXBsYWNlKC8tKy9nLCAnLScpXHJcbiAgICAgIC5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICByaW5nU2l6ZXMgPSBbXHJcbiAgICB7IHNpemU6ICdCYW5kcycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0NvY2t0YWlsJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnQ2FzdWFsIFJpbmdzJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnSGFsbycsIHN0YXR1czogZmFsc2UgfVxyXG4gIF07XHJcblxyXG4gIHByb2R1Y3RUeXBlc0RhdGEgPSBbXHJcbiAgICB7IHNpemU6ICdFYXJyaW5ncycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ1BlbmRhbnRzJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnUmluZ3MnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdOZWNrbGFjZXMnLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdXHJcblxyXG4gIHNob3BGb3JEYXRhID0gW1xyXG4gICAgeyBzaXplOiAnV29tZW4nLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdNZW4nLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdCYWJ5Jywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnS2lkcycsIHN0YXR1czogZmFsc2UgfVxyXG4gIF1cclxuXHJcbiAgbWF0ZXJpYWxTaXplRGF0YSA9IFtcclxuICAgIHsgc2l6ZTogJ1BsYXRpbnVtJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnR29sZCcsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0RpYW1vbmQnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdHZW1zdG9uZScsIHN0YXR1czogZmFsc2UgfVxyXG4gIF1cclxuXHJcbiAgbWV0YWxTaXplRGF0YSA9IFtcclxuICAgIHsgc2l6ZTogJzIyIEtUIFllbGxvdycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJzE4IEtUIFllbGxvdycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJzkgS1QgWWVsbG93Jywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnMTggS1QgV2hpdGUnLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdXHJcblxyXG4gIHRvZ2dsZU1ldGFsU2l6ZShzaXplOiBhbnkpIHtcclxuICAgIHNpemUuc3RhdHVzID0gIXNpemUuc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2hvcFNpemUoc2l6ZTogYW55KSB7XHJcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNpemUoc2l6ZTogYW55KSB7XHJcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVByb2R1Y3RTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNYXRlcmlhbFNpemUoc2l6ZTogYW55KSB7XHJcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcclxuICB9XHJcblxyXG4gIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25zLmZvckVhY2goKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5wcmljZVJhbmdlcy5mb3JFYWNoKHByID0+IHByLnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy5wcmljaW5nTWluID0gdGhpcy5taW5Qcm9kdWN0UHJpY2U7XHJcbiAgICB0aGlzLnByaWNpbmdNYXggPSB0aGlzLm1heFByb2R1Y3RQcmljZTtcclxuICAgIHRoaXMucmF0aW5nT3B0aW9ucy5mb3JFYWNoKChyYXRpbmcpID0+IHJhdGluZy5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHRoaXMubWluUmF0aW5nID0gMDtcclxuICAgIHRoaXMubWF4UmF0aW5nID0gMDtcclxuICAgIHRoaXMucmluZ1NpemVzLmZvckVhY2goKHNpemUpID0+IHNpemUuc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5wcm9kdWN0VHlwZXNEYXRhLmZvckVhY2goKHNpemUpID0+IHNpemUuc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5zaG9wRm9yRGF0YS5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMubWF0ZXJpYWxTaXplRGF0YS5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMubWV0YWxTaXplRGF0YS5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9ucyA9IHt9O1xyXG4gICAgdGhpcy5jdXN0b21SYW5nZVNlbGVjdGlvbnMgPSB7fTtcclxuICAgIHRoaXMudXJsQ2F0ZWdvcnlTbHVncyA9IFtdO1xyXG4gICAgdGhpcy51cmxDb2xsZWN0aW9uU2x1Z3MgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyT3B0aW9uc0tleSA9IG51bGw7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXTtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddKTtcclxuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkpXHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdmaWx0ZXJTY3JvbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBmaWx0ZXJTY3JvbGwhOiBFbGVtZW50UmVmO1xyXG5cclxuICBpc1N5bmNpbmcgPSBmYWxzZTtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5maWx0ZXJTY3JvbGw/Lm5hdGl2ZUVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuaGFuZGxlU3luY1Njcm9sbCgpKTtcclxuICAgIHRoaXMuc3RhcnRUYWdDeWNsZSgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRUYWdDeWNsZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGFnSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICh0aGlzLnJlc3BvbnNlRGF0YSB8fCBbXSkuZm9yRWFjaChwID0+IHtcclxuICAgICAgICBpZiAoKHA/LnRhZ3M/Lmxlbmd0aCA/PyAwKSA+IDEpIHtcclxuICAgICAgICAgIGNvbnN0IGN1ciA9IHRoaXMudGFnSW5kZXhNYXBbcC5pdGVtSWRdID8/IDA7XHJcbiAgICAgICAgICB0aGlzLnRhZ0luZGV4TWFwW3AuaXRlbUlkXSA9IChjdXIgKyAxKSAlIHAudGFncy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sIDMwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMudGFnSW50ZXJ2YWwpO1xyXG4gICAgdGhpcy5saXN0UGF0aFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVN5bmNTY3JvbGwoKSB7XHJcbiAgICAvLyBEb24ndCByZWN1cnNpdmVseSB0cmlnZ2VyIHNjcm9sbHNcclxuICAgIGlmICh0aGlzLmlzU3luY2luZykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlckVsID0gdGhpcy5maWx0ZXJTY3JvbGwubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGxpc3RFbCA9IHRoaXMubGlzdFNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghbGlzdEVsKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIHdoZW4gZmlsdGVyIGhhcyBcInNjcm9sbGVkIHBhc3RcIiB0aGUgaGVpZ2h0IG9mIHRoZSByaWdodCBzaWRlXHJcbiAgICBjb25zdCBmaWx0ZXJTY3JvbGxhYmxlRXhjZXNzID0gZmlsdGVyRWwuc2Nyb2xsSGVpZ2h0IC0gZmlsdGVyRWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgY29uc3QgbGlzdFNjcm9sbGFibGUgPSBsaXN0RWwuc2Nyb2xsSGVpZ2h0IC0gbGlzdEVsLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICBpZiAoZmlsdGVyRWwuc2Nyb2xsVG9wID4gbGlzdFNjcm9sbGFibGUpIHtcclxuICAgICAgdGhpcy5pc1N5bmNpbmcgPSB0cnVlO1xyXG4gICAgICAvLyBTY3JvbGwgcmlnaHQgc2lkZSBpbiBzeW5jIGFzIHdlbGxcclxuICAgICAgbGlzdEVsLnNjcm9sbFRvcCA9IGZpbHRlckVsLnNjcm9sbFRvcCAtIChmaWx0ZXJTY3JvbGxhYmxlRXhjZXNzIC0gbGlzdFNjcm9sbGFibGUpO1xyXG4gICAgICB0aGlzLmlzU3luY2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHRvZ2dsZUl0ZW1Ub0ZhdihldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCwgcHJvZHVjdDogUHJvZHVjdCwgdHlwZTogJ0FERCcgfCAnUkVNT1ZFJykge1xyXG4gICAgaWYgKHR5cGUgPT0gJ0FERCcpIHtcclxuICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1dpc2hsaXN0JywgZGV0YWlsOiAnSXRlbSBhZGRlZCB0byB5b3VyIHdpc2hsaXN0JyB9KTtcclxuICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudChwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCk7XHJcbiAgICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgICBpdGVtVmFyaWVudC53aXNobGlzdCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZShwcm9kdWN0IGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHByb2R1Y3QpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdXaXNobGlzdCcsIGRldGFpbDogJ0l0ZW0gcmVtb3ZlZCBmcm9tIHlvdXIgd2lzaGxpc3QnIH0pO1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHByb2R1Y3QudmFyaWVudElkLCBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvZHVjdC53aGlzbGlzdCkge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LnB1c2gobmV3IE9yZGVyZWRJdGVtcyhwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gdGhpcy5VU0VSX1dJU0hMSVNUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gcHJvZHVjdC52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgfVxyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBhZGRJdGVtVG9DYXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50LCBwcm9kdWN0OiBQcm9kdWN0LCB0eXBlOiAnQUREJyB8ICdTVUJTVFJBQ1QnKSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0NhcnQnLCBkZXRhaWw6ICdJdGVtIGlzIG5vdCBhdmFpbGFibGUgYXMgb2Ygbm93LiBXZSB3aWxsIG5vdGlmeSB5b3Ugb25jZSBhdmFpbGFibGUnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBwcm9kdWN0LnF1YW50aXR5ICs9ICh0eXBlID09ICdBREQnID8gMSA6IC0xKTtcclxuICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgaXRlbVZhcmllbnQucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydChwcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQocHJvZHVjdCk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvZHVjdC5xdWFudGl0eSkge1xyXG4gICAgICBsZXQgaXNQcmVzZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICBpZiAoaXRlbS52YXJpZW50SWQgPT0gcHJvZHVjdC52YXJpZW50SWQpIHtcclxuICAgICAgICAgIGl0ZW0ucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICAgICAgaXNQcmVzZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmICghaXNQcmVzZW50KVxyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXMocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuVVNFUl9DQVJUID0gdGhpcy5VU0VSX0NBUlQ/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSBwcm9kdWN0LnZhcmllbnRJZCkgPz8gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWFyY2hQcm9kdWN0KCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSA/PyBcIlwiKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFZhcmllbnQocHJvZHVjdDogUHJvZHVjdCwgdmFyaWVudDogSXRlbVZhcmlhbnQpIHtcclxuICAgIHByb2R1Y3QudmFyaWVudElkID0gdmFyaWVudC52YXJpYW50SWQ7XHJcbiAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSB2YXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICBwcm9kdWN0LnByaWNlID0gdmFyaWVudC5pdGVtVmFyaWFudFByaWNlO1xyXG4gICAgcHJvZHVjdC5pdGVtSW52ZW50b3J5ID0gdmFyaWVudC5pdGVtSW52ZW50b3J5O1xyXG4gICAgcHJvZHVjdC5xdWFudGl0eSA9IHRoaXMuZ2V0VmFyaWVudFF1YW50aXR5KHZhcmllbnQpO1xyXG4gICAgcHJvZHVjdC53aGlzbGlzdCA9IHRoaXMuaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHZhcmllbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYXJpZW50UXVhbnRpdHkocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogbnVtYmVyIHtcclxuICAgIGxldCBpdGVtUXVhbnRpdHk6IG51bWJlciA9IDA7XHJcbiAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXHJcbiAgICAgICAgaXRlbVF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gaXRlbVF1YW50aXR5O1xyXG4gIH1cclxuICBwcml2YXRlIGlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdChwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBib29sZWFuIHtcclxuICAgIGxldCBwcmVzZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKVxyXG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xyXG4gICAgfSlcclxuICAgIHJldHVybiBwcmVzZW50O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIGFwcGx5RmlsdGVyKGNhdGVnb3J5PzogYW55LCB0eXBlPzogJ1NPUlQnIHwgJ0ZJTFRFUicpIHtcclxuICAvLyAgIHRoaXMucGFnZU5vID0gMTtcclxuICAvLyAgIGlmICh0eXBlID09PSBcIkZJTFRFUlwiKSB7XHJcbiAgLy8gICAgIGNhdGVnb3J5LnN0YXR1cyA9ICFjYXRlZ29yeS5zdGF0dXM7XHJcbiAgLy8gICB9XHJcbiAgLy8gICAvLyBGb3IgU09SVCwgc29ydEJ5IGlzIGFscmVhZHkgc2V0IGZyb20gbmdNb2RlbFxyXG4gIC8vICAgdGhpcy5maWx0ZXJCb3R0b21TaGVldFJlZj8uZGlzbWlzcygpO1xyXG4gIC8vICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSk7XHJcbiAgLy8gfVxyXG5cclxuICBuYXZpZ2F0ZUZpbHRlcihzb3J0aW5nOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc29ydEJ5ID0gc29ydGluZztcclxuICAgIGxldCBzZWxlY3RlZENhdGVnb3J5ID0gXCJcIjtcclxuICAgIGxldCBzZWxlY3RlZENvbGxlY3Rpb24gPSBcIlwiO1xyXG4gICAgdGhpcy5jYXRlZ29yaWVzLmZpbHRlcigoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnN0YXR1cykubWFwKChjYXRlZ29yeSkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmNhdGVnb3J5LFxyXG4gICAgICAgIHNsdWc6IGNhdGVnb3J5Lm9wdGlvbi5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgICAgfVxyXG4gICAgfSkuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHNlbGVjdGVkQ2F0ZWdvcnkgKz0gKGNhdGVnb3J5LnNsdWcgKyBcIitcIikpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc3RhdHVzKS5tYXAoKGNvbGxlY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5jb2xsZWN0aW9uLFxyXG4gICAgICAgIHNsdWc6IGNvbGxlY3Rpb24ub3B0aW9uLnJlcGxhY2VBbGwoXCIgXCIsIFwiX1wiKVxyXG4gICAgICB9XHJcbiAgICB9KS5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiBzZWxlY3RlZENvbGxlY3Rpb24gKz0gKGNvbGxlY3Rpb24uc2x1ZyArIFwiK1wiKSk7XHJcbiAgICB0aGlzLnNvcnRpbmdEaWFsb2dSZWY/LmRpc21pc3MoKTtcclxuICAgIHRoaXMuZmlsdGVySXRlbUxpc3QoKTtcclxuICB9XHJcbiAgY2xvc2VGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmZpbHRlckJvdHRvbVNoZWV0UmVmPy5kaXNtaXNzKCk7XHJcbiAgfVxyXG4gIG9wZW5GaWx0ZXIoRmlsdGVyU2VjdGlvbjogYW55KSB7XHJcbiAgICB0aGlzLmZpbHRlckJvdHRvbVNoZWV0UmVmID0gdGhpcy5tYXRCb3R0b21TaGVldC5vcGVuKEZpbHRlclNlY3Rpb24pO1xyXG4gIH1cclxuICBvcGVuU29ydGluZyhTb3J0aW5nU2VjdGlvbjogYW55KSB7XHJcbiAgICB0aGlzLnNvcnRpbmdEaWFsb2dSZWYgPSB0aGlzLm1hdEJvdHRvbVNoZWV0Lm9wZW4oU29ydGluZ1NlY3Rpb24sIHt9KTtcclxuICB9XHJcbiAgcGFnaW5hdGlvbkNoYW5nZShwYWdlOiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZU5vID0gcGFnZTtcclxuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJcIik7XHJcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICB9XHJcbiAgY2xvc2VEaWFsb2coKSB7XHJcbiAgICB0aGlzLnNvcnRpbmdEaWFsb2dSZWY/LmRpc21pc3MoKTtcclxuICB9XHJcbiAgaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0OiBQcm9kdWN0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gcHJvZHVjdC5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPT0gMDtcclxuICB9XHJcbiAgZ2V0SXRlbVZhcmllbnQocHJvZHVjdDogUHJvZHVjdCwgdmFyaWVudElkOiBzdHJpbmcpOiBJdGVtVmFyaWFudCB8IG51bGwge1xyXG4gICAgbGV0IHNlbGVjdGVkVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gbnVsbDtcclxuICAgIHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCkgPT4ge1xyXG4gICAgICBpZiAodmFyaWVudC52YXJpYW50SWQgPT09IHZhcmllbnRJZClcclxuICAgICAgICBzZWxlY3RlZFZhcmllbnQgPSB2YXJpZW50O1xyXG4gICAgfSlcclxuICAgIHJldHVybiBzZWxlY3RlZFZhcmllbnQ7XHJcbiAgfVxyXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8IDQ3NTtcclxuICB9XHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQlVTSU5FU1NfQ09OU1RBTlRTLkNVUlJFTkNZO1xyXG4gIH1cclxuICBnZXQgbWluU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMudG90YWxDb3VudCwgKCgodGhpcy5wYWdlTm8gLSAxKSAqIHRoaXMuc2l6ZSArIDEpICsgdGhpcy5zaXplKSk7XHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0SW1hZ2VzKHByb2R1Y3Q6IGFueSkge1xyXG4gICAgaWYgKCFwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddKSBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddID0gMDtcclxuICAgIGxldCBpbWFnZUluZGV4OiBudW1iZXIgPSBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddICUgcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/Lmxlbmd0aDtcclxuICAgIHJldHVybiBwcm9kdWN0Py5bJ2l0ZW1JbWFnZXMnXT8uW2ltYWdlSW5kZXhdPy5pbWdVcmxcclxuICB9XHJcblxyXG4gIGFzeW5jIGNoYW5nZUltYWdlKHByb2R1Y3Q6IGFueSwgYWN0aW9uOiAnUFJFVicgfCAnTkVYVCcsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaW1hZ2VJbmRleCA9IGluZGV4O1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMCkpO1xyXG4gICAgaWYgKGFjdGlvbiA9PT0gJ05FWFQnKSB7XHJcbiAgICAgIHByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10rKztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10tLTtcclxuICAgICAgaWYgKHByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10gPCAwKVxyXG4gICAgICAgIHByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10gPSBwcm9kdWN0Py5bJ2l0ZW1JbWFnZXMnXT8ubGVuZ3RoIC0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuaW1hZ2VJbmRleCA9IC0xO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnV0dG9uSWQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uaWQgPz8gXCJcIjtcclxuICB9XHJcbiAgZ2V0QnV0dG9uU3R5bGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uc3R5bGVzO1xyXG4gIH1cclxuICBnZXRFbGVtZW50Um93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3R5bGVzPy5lbGVtZW50SW5Sb3cgPz8gNVxyXG4gIH1cclxuXHJcbiAgc2hvd0FsbENhdGVnb3JpZXMgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGRpc3BsYXllZENhdGVnb3JpZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93QWxsQ2F0ZWdvcmllcyA/IHRoaXMuY2F0ZWdvcmllcyA6IHRoaXMuY2F0ZWdvcmllcy5zbGljZSgwLCA0KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3JpZXMoKSB7XHJcbiAgICB0aGlzLnNob3dBbGxDYXRlZ29yaWVzID0gIXRoaXMuc2hvd0FsbENhdGVnb3JpZXM7XHJcbiAgfVxyXG5cclxuICBzaG93QWxsQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGRpc3BsYXllZENvbGxlY3Rpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbENvbGxlY3Rpb25zID8gdGhpcy5jb2xsZWN0aW9ucyA6IHRoaXMuY29sbGVjdGlvbnMuc2xpY2UoMCwgNCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDb2xsZWN0aW9ucygpIHtcclxuICAgIHRoaXMuc2hvd0FsbENvbGxlY3Rpb25zID0gIXRoaXMuc2hvd0FsbENvbGxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgc2hvd0FsbEJyYW5kcyA9IGZhbHNlO1xyXG5cclxuICBnZXQgZGlzcGxheWVkQnJhbmRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbEJyYW5kcyA/IHRoaXMuYnJhbmRzIDogdGhpcy5icmFuZHMuc2xpY2UoMCwgNCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVCcmFuZHMoKSB7XHJcbiAgICB0aGlzLnNob3dBbGxCcmFuZHMgPSAhdGhpcy5zaG93QWxsQnJhbmRzO1xyXG4gIH1cclxuXHJcbiAgY2F0ZWdvcmllc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIGNvbGxlY3Rpb25zQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgYnJhbmRzQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgcmF0aW5nc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHByaWNlQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgcHJvZHVjdFR5cGVDb2xsYXBzZWQgPSBmYWxzZTtcclxuICBzaG9wRm9yQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgbWF0ZXJpYWxDb2xsYXBzZWQgPSBmYWxzZTtcclxuICBtZXRhbENvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHJpbmdTdHlsZUNvbGxhcHNlZCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBGZWVkcyB0aGUgSG9tZSBWaXNpdCBib29raW5nIGZsb3cgZGlyZWN0bHkgKEJvb2tpbmdHcm91cC5wcm9kdWN0TGluZXMpIHJhdGhlciB0aGFuIHRoZVxyXG4gICAqIHJldGlyaW5nIFRSSUFMX0NBUlQuIEp1c3QgYWRkcyB0byB0aGUgbG9jYWwgSG9tZSBWaXNpdCBjYXJ0IGFuZCBjb25maXJtcyB3aXRoIGEgdG9hc3Qg4oCUIGl0XHJcbiAgICogZG9lcyBub3Qgb3BlbiB0aGUgYm9va2luZyB3aXphcmQsIHNvIGEgc2hvcHBlciBjYW4ga2VlcCBicm93c2luZyB0aGUgZ3JpZCBhbmQgYWRkIG1vcmVcclxuICAgKiBwaWVjZXMuIFRoZXkgY29udGludWUgaW50byB0aGUgd2l6YXJkIGxhdGVyIGZyb20gdGhlIEJvb2tpbmcgQ2FydCAoaGVhZGVyIGljb24gLyBjYXJ0IHBhZ2UpLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFRvVHJpYWxDYXJ0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZS5hZGRJdGVtKCdIT01FX1ZJU0lUJywgcHJvZHVjdCBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLmJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UuYWRkSXRlbSgnSE9NRV9WSVNJVCcsIHByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnVHJ5IGF0IGhvbWUnLCBkZXRhaWw6ICdBZGRlZCB0byB5b3VyIEhvbWUgVmlzaXQgY2FydCcgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYW1lIHNoYXBlIGFzIGFkZFRvVHJpYWxDYXJ0KCkgLSBhZGRzIHRoZSBwcm9kdWN0IGRpcmVjdGx5IHRvIHRoZSBsb2NhbCBWaWRlbyBDYWxsIGNhcnQgYW5kXHJcbiAgICogY29uZmlybXMgd2l0aCBhIHRvYXN0LCBubyBkaWFsb2csIG5vIG5hbWUvbW9iaWxlIGNvbGxlY3Rpb24gaGVyZSAodGhhdCBoYXBwZW5zIGxhdGVyLCBpblxyXG4gICAqIENvbnRhY3QgRGV0YWlscyBvbiB0aGUgZGVkaWNhdGVkIGJvb2tpbmcgcGFnZSkuXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkVmlkZW9DYWxsQ3VycmVudChwcm9kdWN0OiBQcm9kdWN0KSB7XHJcbiAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA/IHRoaXMuZ2V0SXRlbVZhcmllbnQocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpIDogbnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZS5hZGRJdGVtKCdWSURFT19DQUxMJywgcHJvZHVjdCwgaXRlbVZhcmllbnQ/LnZhcmlhbnRJZCA/PyB1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdWaWRlbyBDYWxsJywgZGV0YWlsOiAnQWRkZWQgdG8geW91ciBWaWRlbyBDYWxsIHJlcXVlc3QnIH0pO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0NvdWxkIG5vdCBhZGQgdGhpcyBwcm9kdWN0IHRvIHlvdXIgdmlkZW8gY2FsbCDigJQgcGxlYXNlIHRyeSBhZ2FpbicgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vZGFsKCkge1xyXG4gICAgY29uc3QgbW9kYWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVNb2RhbENlbnRlcicpO1xyXG4gICAgaWYgKG1vZGFsRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShtb2RhbEVsZW1lbnQsICdkYXRhLWJzLWRpc21pc3MnLCAnbW9kYWwnKTtcclxuICAgICAgbW9kYWxFbGVtZW50LmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUZXh0Q29sb3IoY29sb3I6IGFueSkge1xyXG4gICAgY29uc3QgdGhyZXNob2xkID0gMTMwO1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDEsIDMpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMywgNSksIDE2KTtcclxuICAgIGNvbnN0IGIgPSBwYXJzZUludChjb2xvci5zbGljZSg1LCA3KSwgMTYpO1xyXG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IChyICogMjk5ICsgZyAqIDU4NyArIGIgKiAxMTQpIC8gMTAwMDtcclxuXHJcbiAgICByZXR1cm4gYnJpZ2h0bmVzcyA+IHRocmVzaG9sZCA/ICcjMDAwMDAwJyA6ICcjZmZmZmZmJztcclxuICB9XHJcbn1cclxuIiwiPHAtdG9hc3QgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIiBbYmFzZVpJbmRleF09XCIxMDAwMDAwMDAwMFwiIFthdXRvWkluZGV4XT1cInRydWVcIlxyXG4gIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuPHAtdG9hc3QgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIiBbYmFzZVpJbmRleF09XCIxMDAwMDAwMDAwMFwiIFthdXRvWkluZGV4XT1cInRydWVcIiBrZXk9XCJWaWRlbyBDYWxsIFNjaGVkdWxlXCJcclxuICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gU2NoZWR1bGluZ1wiXHJcbiAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG5cclxuPCEtLSA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIiAqbmdJZj1cImlzTW9iaWxlXCIgW25nQ2xhc3NdPVwieydpbnB1dC1ncm91cC1zdGlja3knOiBzY3JvbGxpbmdWYWx1ZSA+IDIwfVwiPlxyXG4gIDxtYXQtaWNvbiBjbGFzcz1cImYtMjAgZC1mbGV4IGFsaWduLWl0ZW0tY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5zZWFyY2g8L21hdC1pY29uPlxyXG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggUHJvZHVjdC4uXCIgYXJpYS1sYWJlbD1cIlNlYXJjaCBQcm9kdWN0XCJcclxuICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFByb2R1Y3QoKVwiPlxyXG48L2Rpdj4gLS0+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxzZWN0aW9uIFtpZF09XCJkYXRhPy5pZFwiIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHRvdGFsLWNvbnRhaW5lclwiIFtzaW1wb0xheW91dF09XCJzdHlsZXM/LmxheW91dFwiIHNpbXBvSG92ZXJcclxuICAgIChob3ZlcmluZyk9XCJzaG93RWRpdFRhYnMoJGV2ZW50KVwiIFtzaW1wb0JhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCJcclxuICAgIFtzdHlsZS5wYWRkaW5nVG9wLnB4XT1cImlzTW9iaWxlID8gJzAgIWltcG9ydGFudCcgOiAnJ1wiIFthdHRyLnN0eWxlXT1cImN1c3RvbUNsYXNzXCJcclxuICAgIFtzcGFjaW5nSG9yaXpvbnRhbF09XCJzdHlsZXNMYXlvdXRcIj5cclxuXHJcbiAgICA8IS0tIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCIgY2xhc3M9XCJzcGVlZGRpYWwtbGluZWFyXCIgKm5nSWY9XCJpc01vYmlsZVwiPlxyXG4gICAgICA8cC1zcGVlZERpYWwgW21vZGVsXT1cIml0ZW1zXCIgZGlyZWN0aW9uPVwidXBcIlxyXG4gICAgICAgIFtidXR0b25TdHlsZV09XCJ7J2JvcmRlci1yYWRpdXMnOiAnNTAlJywgJ2hlaWdodCc6ICczMHB4J31cIj48L3Atc3BlZWREaWFsPlxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIHctMTAwIG9ubHlEZXNrdG9wXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9wLXNlY3Rpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWJhc2VsaW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlciBib2R5LWxhcmdlXCI+XHJcbiAgICAgICAgICBGaWx0ZXJzXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCIgKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgICAgQ0xFQVIgQUxMXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGl0ZW1pZD1cInRvcC1zZWN0aW9uXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcclxuICAgICAgICBzdHlsZT1cIndpZHRoOiA3Ny41JTsgbWFyZ2luLXJpZ2h0OiAxJTtcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xNVwiIHN0eWxlPVwid2lkdGg6IDc1JTsgZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGRpc3BsYXlDaGlwc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW0tY2VudGVyIHctOTAgY2hpcFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7ZmlsdGVyLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgd2lkdGg6MjBweDsgaGVpZ2h0OiAyMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoZmlsdGVyKVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwiZ2FwOiAxMHB4O1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgZnctbm9ybWFsIG1yLTNcIj5Tb3J0IGJ5PC9kaXY+XHJcbiAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwic29ydEJ5XCIgKGNoYW5nZSk9XCJhcHBseUZpbHRlcigkZXZlbnQsICdTT1JUJylcIiBzdHlsZT1cImNvbG9yOiBibGFjaztcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiZmlsdGVyLnZhbHVlXCIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJpbmdBcnJheVwiPnt7IGZpbHRlci5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zb3J0LWRyb3Bkb3duXCIgdGFiaW5kZXg9XCIwXCIgKGJsdXIpPVwiY2xvc2VEcm9wZG93bigpXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydC1sYWJlbFwiPlNvcnQgQnk6PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3RlZC12YWx1ZVwiPnt7IGdldFNlbGVjdGVkTmFtZSgpIHx8ICdGZWF0dXJlZCcgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1pY29uXCIgW2NsYXNzLm9wZW5dPVwiaXNPcGVuXCI+JiM5NjYyOzwvc3Bhbj4gPCEtLSBEb3duIGFycm93LCByb3RhdGVzIG9wZW4gLS0+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnNcIiAqbmdJZj1cImlzT3BlblwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyaW5nQXJyYXlcIiBjbGFzcz1cIm9wdGlvblwiIFtjbGFzcy5zZWxlY3RlZF09XCJmaWx0ZXIudmFsdWUgPT09IHNvcnRCeVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihmaWx0ZXIsICRldmVudClcIj5cclxuICAgICAgICAgICAgICB7eyBmaWx0ZXIubmFtZSB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXNNb2JpbGVcIiBjbGFzcz1cImQtZmxleCB3LTEwMCBvbmx5TW9iaWxlIGdhcC0xNSBmbGV4LXdyYXBcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGRpc3BsYXlDaGlwc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbS1jZW50ZXIgdy05MCBjaGlwXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2ZpbHRlci5uYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgd2lkdGg6MjBweDsgaGVpZ2h0OiAyMHB4O1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6IDIwcHg7XCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIpXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYWluLXByb2R1Y3Qtc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXNpZGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmlsdGVyU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9BbmltYXRpb25dPVwic3R5bGVzPy5hbmltYXRpb25cIiBjbGFzcz1cInJpZ2h0LXNpZGVcIiAoc2Nyb2xsKT1cImhhbmRsZVByb2R1Y3RMaXN0U2Nyb2xsKClcIlxyXG4gICAgICAgICNsaXN0U2Nyb2xsQ29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYXBpTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcGFyZW50XCIgKm5nSWY9XCJyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiByZXNwb25zZURhdGE7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cInByb2R1Y3RcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJhcHBseVByb2R1Y3RXaWR0aCgpID8gZ2V0UHJvZHVjdFdpZHRoKCkgOiAnJ1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7IHBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy50aGVtZSA9PSB0aGVtZS5UaGVtZTFcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzYzsgY29udGV4dDoge2RhdGE6IHByb2R1Y3QsIGluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZXM/LnRoZW1lICE9IHRoZW1lLlRoZW1lMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNpbXBvLXNtYWxsLXByb2R1Y3QtbGlzdGluZyBbcHJvZHVjdF09XCJwcm9kdWN0XCIgW2RhdGFdPVwiZGF0YVwiIFtpc1Njcm9sbGFibGVdPVwic2NyZWVuV2lkdGggPiA0NzVcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaVwiPjwvc2ltcG8tc21hbGwtcHJvZHVjdC1saXN0aW5nPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMaXN0TG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJlbXB0eS1jYXJ0XCIgKm5nSWY9XCIhaXNMaXN0TG9hZGluZyAmJiByZXNwb25zZURhdGE/Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzdHlsZT1cImhlaWdodDogMTUwcHg7IHdpZHRoOiAxNTBweDtcIlxyXG4gICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzEwNzIxM2MxNzE2NTQzMzM0MDQwZW1wdHktY2FydC5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZy1tZWRpdW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgUHJvZHVjdCBsaXN0IGlzIGVtcHR5XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIExvb2tzIGxpa2Ugbm8gaXRlbSBpcyBwcmVzZW50IHdpdGggZmlsdGVyLiBHbyBhaGVhZCAmIGV4cGxvcmUgdG9wIGNhdGVnb3JpZXMuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiYXBpTG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tZmlsdGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmaWx0ZXItdGV4dFwiIHN0eWxlPVwiZ2FwOiAxMHB4XCIgKGNsaWNrKT1cIm9wZW5Tb3J0aW5nKFNvcnRpbmdTZWN0aW9uKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPnNvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+U29ydCBieTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmlsdGVyLXRleHRcIiBzdHlsZT1cImdhcDogMTBweFwiIChjbGljayk9XCJvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb24pXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+RmlsdGVyPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cclxuICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiXHJcbiAgICAgICAgW2lzRWNvbW1lcmNlXT1cInRydWVcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxyXG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCJcclxuICBbdGhlbWVdPVwieyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICc0MHZoJywgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsICdyaWdodCc6ICc1cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI0Zhdm91cml0ZVRhZ3MgbGV0LXByb2R1Y3Q9XCJkYXRhXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZhdi1pY29uLXdyYXBwZXJcIj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCIgKm5nSWY9XCIhcHJvZHVjdC53aGlzbGlzdFwiPmZhdm9yaXRlX2JvcmRlclxyXG4gICAgPC9tYXQtaWNvbj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ1JFTU9WRScpXCIgKm5nSWY9XCJwcm9kdWN0LndoaXNsaXN0XCI+ZmF2b3JpdGVcclxuICAgIDwvbWF0LWljb24+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZhdi10b29sdGlwXCI+XHJcbiAgICAgIHt7IHByb2R1Y3Qud2hpc2xpc3QgPyAnUmVtb3ZlIGZyb20gd2lzaGxpc3QnIDogJ0FkZCB0byB3aXNobGlzdCcgfX1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNUYWdzIGxldC1wcm9kdWN0PVwiZGF0YVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXRhZy1iYWRnZVwiICpuZ0lmPVwicHJvZHVjdD8udGFncz8ubGVuZ3RoXCI+XHJcbiAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdGFnIG9mIHByb2R1Y3QudGFnczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwicHJvZHVjdC10YWctbGFiZWxcIlxyXG4gICAgICBbY2xhc3MudGFnLWFjdGl2ZV09XCJpID09PSAodGFnSW5kZXhNYXBbcHJvZHVjdC5pdGVtSWRdID8/IDApXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRUZXh0Q29sb3Ioc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcilcIj5cclxuICAgICAge3sgdGFnIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNGaWx0ZXJTZWN0aW9uPlxyXG4gIDxzZWN0aW9uPlxyXG4gICAgPCEtLSBTZXJ2ZXItZHJpdmVuIGZpbHRlcnMgZnJvbSBxdWVyeS1vcHRpb25zIChCcmFuZCwgQ2F0ZWdvcmllcywgQ29sbGVjdGlvbnMsIFNwZWNpZmljYXRpb25zLCAuLi4pLlxyXG4gICAgICAgICBFbXB0eSBmb3IgdW5zZWVkZWQgYnVzaW5lc3NlcywgaW4gd2hpY2ggY2FzZSB0aGUgbGVnYWN5IGJsb2NrcyBiZWxvdyBhcmUgdGhlIHNpZGViYXIuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBjdXN0b21GaWx0ZXJHcm91cHNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwiY3VzdG9tR3JvdXBDb2xsYXBzZWRbZ3JvdXAua2V5XSA9ICFjdXN0b21Hcm91cENvbGxhcHNlZFtncm91cC5rZXldXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj57eyBncm91cC5sYWJlbCB9fTwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBjdXN0b21Hcm91cENvbGxhcHNlZFtncm91cC5rZXldID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21Hcm91cENvbGxhcHNlZFtncm91cC5rZXldXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGdyb3VwLmZpbHRlcnNcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJncm91cC5maWx0ZXJzLmxlbmd0aCA+IDFcIiBjbGFzcz1cInRyaW0tdGV4dFwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLXRvcDogOHB4O1wiPlxyXG4gICAgICAgICAgICB7eyBmaWx0ZXIubGFiZWwgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuY29udHJvbCA9PT0gJ1JBTkdFJzsgZWxzZSBjdXN0b21DaG9pY2VzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDhweDsgbWFyZ2luLXRvcDogNnB4O1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMDtcIiBbYXR0ci5taW5dPVwiZmlsdGVyLm1pblwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5tYXhdPVwiZmlsdGVyLm1heFwiIFtwbGFjZWhvbGRlcl09XCInTWluICcgKyAoZmlsdGVyLm1pbiA/PyAnJylcIlxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VzdG9tUmFuZ2UoZmlsdGVyLmlkZW50aWZpZXIpLm1pblwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEN1c3RvbVJhbmdlKGZpbHRlci5pZGVudGlmaWVyLCAnbWluJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuPi08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAwO1wiIFthdHRyLm1pbl09XCJmaWx0ZXIubWluXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLm1heF09XCJmaWx0ZXIubWF4XCIgW3BsYWNlaG9sZGVyXT1cIidNYXggJyArIChmaWx0ZXIubWF4ID8/ICcnKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXN0b21SYW5nZShmaWx0ZXIuaWRlbnRpZmllcikubWF4XCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0Q3VzdG9tUmFuZ2UoZmlsdGVyLmlkZW50aWZpZXIsICdtYXgnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21DaG9pY2VzPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLmNvbnRyb2wgPT09ICdCT09MRUFOJyAmJiAhZmlsdGVyLmNob2ljZXM/Lmxlbmd0aDsgZWxzZSBjaG9pY2VMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDdXN0b21DaG9pY2VTZWxlY3RlZChmaWx0ZXIuaWRlbnRpZmllciwgJ3RydWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ3VzdG9tQ2hvaWNlKGZpbHRlciwgJ3RydWUnKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+WWVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hvaWNlTGlzdD5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBmaWx0ZXIuY2hvaWNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDdXN0b21DaG9pY2VTZWxlY3RlZChmaWx0ZXIuaWRlbnRpZmllciwgY2hvaWNlLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ3VzdG9tQ2hvaWNlKGZpbHRlciwgY2hvaWNlLnZhbHVlKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgY2hvaWNlLmxhYmVsIH19IDxzcGFuICpuZ0lmPVwiY2hvaWNlLmNvdW50ICE9PSB1bmRlZmluZWRcIj4oe3sgY2hvaWNlLmNvdW50IH19KTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE5vIGxlZ2FjeSBDYXRlZ29yaWVzIGJsb2NrOiBjYXRlZ29yaWVzIGFyZSBzaG93biBvbmx5IHdoZW4gcXVlcnktb3B0aW9ucyByZXR1cm5zIHRoZW0uIC0tPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cImNvbGxlY3Rpb25zPy5sZW5ndGggJiYgIWlzQXBpRmlsdGVyKCdjb2xsZWN0aW9uJylcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwiY29sbGVjdGlvbnNDb2xsYXBzZWQgPSAhY29sbGVjdGlvbnNDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPlNob3AgYnkgQ29sbGVjdGlvbnM8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgY29sbGVjdGlvbnNDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbGxlY3Rpb25zQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgY29sbGVjdGlvbiBvZiBkaXNwbGF5ZWRDb2xsZWN0aW9uc1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoY29sbGVjdGlvbiwgJ0ZJTFRFUicpXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJjb2xsZWN0aW9uLnN0YXR1c1wiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3tjb2xsZWN0aW9uLm9wdGlvbiB8IHRpdGxlY2FzZX19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbGxlY3Rpb25zLmxlbmd0aCA+IDRcIiBjbGFzcz1cInRvZ2dsZS1jYXRlZ29yaWVzXCIgKGNsaWNrKT1cInRvZ2dsZUNvbGxlY3Rpb25zKClcIlxyXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRleHRcIj5cclxuICAgICAgICAgICAge3sgc2hvd0FsbENvbGxlY3Rpb25zID8gJ1Nob3cgTGVzcycgOiAnU2hvdyBNb3JlJyB9fVxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3Bkb3duLWljb25cIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dBbGxDb2xsZWN0aW9uc1wiPjxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBbGxDb2xsZWN0aW9uc1wiPjxtYXQtaWNvbj5leHBhbmRfbGVzczwvbWF0LWljb24+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCIoYnJhbmRzPy5sZW5ndGggPz8gMCkgPiAxICYmICFpc0FwaUZpbHRlcignYnJhbmQnKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJicmFuZHNDb2xsYXBzZWQgPSAhYnJhbmRzQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5TaG9wIGJ5IEJyYW5kPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IGJyYW5kc0NvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYnJhbmRzQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgYnJhbmQgb2YgZGlzcGxheWVkQnJhbmRzXCJcclxuICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcihicmFuZCwgJ0ZJTFRFUicpXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJicmFuZC5zdGF0dXNcIiAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7YnJhbmQub3B0aW9uIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYnJhbmRzLmxlbmd0aCA+IDRcIiBjbGFzcz1cInRvZ2dsZS1jYXRlZ29yaWVzXCIgKGNsaWNrKT1cInRvZ2dsZUJyYW5kcygpXCJcclxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS10ZXh0XCI+XHJcbiAgICAgICAgICAgIHt7IHNob3dBbGxCcmFuZHMgPyAnU2hvdyBMZXNzJyA6ICdTaG93IE1vcmUnIH19XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taWNvblwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0FsbEJyYW5kc1wiPjxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBbGxCcmFuZHNcIj48bWF0LWljb24+ZXhwYW5kX2xlc3M8L21hdC1pY29uPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwicHJvZHVjdFR5cGVDb2xsYXBzZWQgPSAhcHJvZHVjdFR5cGVDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPlByb2R1Y3QgVHlwZTwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBwcm9kdWN0VHlwZUNvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcHJvZHVjdFR5cGVDb2xsYXBzZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBzaXplIG9mIHByb2R1Y3RUeXBlc0RhdGFcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNpemUuc3RhdHVzXCIgKGNoYW5nZSk9XCJ0b2dnbGVQcm9kdWN0U2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwic2hvcEZvckNvbGxhcHNlZCA9ICFzaG9wRm9yQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5TaG9wIGZvcjwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBzaG9wRm9yQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG9wRm9yQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBzaG9wRm9yRGF0YVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2l6ZS5zdGF0dXNcIiAoY2hhbmdlKT1cInRvZ2dsZVNob3BTaXplKHNpemUpXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyBzaXplLnNpemUgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCJ0b1Nob3dJbkpld2VsbGVyeVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJtYXRlcmlhbENvbGxhcHNlZCA9ICFtYXRlcmlhbENvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+TWF0ZXJpYWw8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgbWF0ZXJpYWxDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1hdGVyaWFsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBtYXRlcmlhbFNpemVEYXRhXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlTWF0ZXJpYWxTaXplKHNpemUpXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyBzaXplLnNpemUgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCJ0b1Nob3dJbkpld2VsbGVyeVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJtZXRhbENvbGxhcHNlZCA9ICFtZXRhbENvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+TWV0YWw8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgbWV0YWxDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1ldGFsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBtZXRhbFNpemVEYXRhXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlTWV0YWxTaXplKHNpemUpXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyBzaXplLnNpemUgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCJ0b1Nob3dJbkpld2VsbGVyeVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJyaW5nU3R5bGVDb2xsYXBzZWQgPSAhcmluZ1N0eWxlQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5SaW5nIFN0eWxlPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IHJpbmdTdHlsZUNvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmluZ1N0eWxlQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiByaW5nU2l6ZXNcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNpemUuc3RhdHVzXCIgKGNoYW5nZSk9XCJ0b2dnbGVTaXplKHNpemUpXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyBzaXplLnNpemUgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJhdGluZ3MgYW5kIHByaWNlIHN0YXkgYXQgdGhlIGJvdHRvbSwgYmVsb3cgdGhlIHNlcnZlci1kcml2ZW4gZmlsdGVycy4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJhdGluZ3NDb2xsYXBzZWQgPSAhcmF0aW5nc0NvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+UmF0aW5nczwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyByYXRpbmdzQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyYXRpbmdzQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgcmF0aW5nIG9mIHJhdGluZ09wdGlvbnNcIiAoY2xpY2spPVwib25SYXRpbmdDaGFuZ2UocmF0aW5nKVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwicmF0aW5nLnNlbGVjdGVkXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyByYXRpbmcubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInByaWNlQ29sbGFwc2VkID0gIXByaWNlQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5TaG9wIGJ5IHByaWNlPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IHByaWNlQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwcmljZUNvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgcmFuZ2Ugb2YgcHJpY2VSYW5nZXM7bGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyYW5nZS5zZWxlY3RlZFwiIChjaGFuZ2UpPVwib25QcmljZVJhbmdlQ2hhbmdlKGkpXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyByYW5nZS5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNTb3J0aW5nU2VjdGlvbj5cclxuICA8c2VjdGlvbiBzdHlsZT1cInBhZGRpbmc6IDEwcHhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW0tY2VudGVyIFwiIHN0eWxlPVwicGFkZGluZzogMHB4O1wiPlxyXG4gICAgICA8c3Bhbj5Tb3J0IGJ5PC9zcGFuPlxyXG4gICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIiBbKG5nTW9kZWwpXT1cInNvcnRCeVwiPlxyXG4gICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdGb3I9XCJsZXQgc29ydGluZ1R5cGUgb2YgZmlsdGVyaW5nQXJyYXlcIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKHNvcnRpbmdUeXBlLCAkZXZlbnQpXCJcclxuICAgICAgICBbdmFsdWVdPVwic29ydGluZ1R5cGUudmFsdWVcIj57e3NvcnRpbmdUeXBlLm5hbWV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjUHJvZHVjdERlc2MgbGV0LXByb2R1Y3Q9XCJkYXRhXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cclxuICA8bmctdGVtcGxhdGUgI3RoZW1lMXN0eWxlMT5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQgcG9zaXRpb24tcmVsYXRpdmUgaC0xMDBcIiBbbmdDbGFzc109XCJ7J2hvdmVyLWVmZmVjdCc6IHN0eWxlcz8udGhlbWUgPT0gdGhlbWUuVGhlbWUxfVwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIShwcm9kdWN0Lml0ZW1JbWFnZXM/Lmxlbmd0aCAmJiBwcm9kdWN0Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsKVwiXHJcbiAgICAgICAgY2xhc3M9XCJkZWZhdWx0LWltYWdlIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QpXCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmF2b3VyaXRlVGFnczsgY29udGV4dDoge2RhdGE6IHByb2R1Y3R9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJwcm9kdWN0Lml0ZW1JbWFnZXM/Lmxlbmd0aCAmJiBwcm9kdWN0Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsXCJcclxuICAgICAgICBjbGFzcz1cImRlZmF1bHQtaW1hZ2UgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiXHJcbiAgICAgICAgICBbc3JjXT1cImdldFByb2R1Y3RJbWFnZXMocHJvZHVjdClcIiBhbHQ9XCJcIiBjbGFzcz1cInByb2R1Y3QtaW1nXCIgW2NsYXNzLmZhZGUtb3V0XT1cImltYWdlSW5kZXggPT0gaW5kZXhcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QpXCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYnV0dG9uc1wiICpuZ0lmPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICA8ZGl2PjxtYXQtaWNvbiAoY2xpY2spPVwiY2hhbmdlSW1hZ2UocHJvZHVjdCwgJ1BSRVYnLCBpbmRleClcIj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj48L2Rpdj5cclxuICAgICAgICAgIDxkaXY+PG1hdC1pY29uIChjbGljayk9XCJjaGFuZ2VJbWFnZShwcm9kdWN0LCAnTkVYVCcsIGluZGV4KVwiPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmF2b3VyaXRlVGFnczsgY29udGV4dDoge2RhdGE6IHByb2R1Y3R9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHctMTAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQtbGlzdFwiICpuZ0lmPVwicHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiBwcm9kdWN0Py5pdGVtVmFyaWFudDsgbGV0IGlkeCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cInZhcmllbnQudmFyaWFudEltYWdlcz8uWzBdPy5pbWdVcmxcIiBhbHQ9XCJcIiBjbGFzcz1cInZhcmllbnRcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdmFyaWVudCc6IHZhcmllbnQudmFyaWFudElkID09IHByb2R1Y3QudmFyaWVudElkfVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInZhcmllbnQudmFyaWFudElkID09IHByb2R1Y3QudmFyaWVudElkID8gJ2JsdWUnIDogJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQocHJvZHVjdCwgdmFyaWVudClcIj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbS1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiBbc3R5bGUuZGlzcGxheV09XCJ0cnVlID8gJ2Jsb2NrIWltcG9ydGFudCcgOiAnJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlIGJvZHktbGFyZ2UgdGV4dC1sZWZ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZy0xMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTZcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICAgICAgICB7e3Byb2R1Y3Q/LnByaWNlPy5zZWxsaW5nUHJpY2UgfCBudW1iZXI6JzEuMC0wJ319XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE2IHRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3Q/LnByaWNlPy52YWx1ZSAtIHByb2R1Y3Q/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgPiAyXCIgY2xhc3M9XCJkaXNjb3VudC1wcmljZVwiPlxyXG4gICAgICAgICAgICAgICAge3twcm9kdWN0Py5wcmljZT8udmFsdWUgfCBudW1iZXI6JzEuMC0wJ319XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHJpY2UgZGlzY291bnQtcHJpY2VcIiAqbmdJZj1cInByb2R1Y3Q/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgPCBwcm9kdWN0Py5wcmljZT8uc2VsbGluZ1ByaWNlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAgICAgICAge3twcm9kdWN0LnByaWNlLnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4wLTAnfX1cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtbmFtZSBoZWFkaW5nLWxhcmdlIHctMTAwIHRleHQtbGVmdCB0cmltLXRleHRcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7IHByb2R1Y3QubmFtZSB9fTwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbmZvXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpc01hdGVyaWFsQmFzZWRQcmljaW5nICYmIChwcm9kdWN0Py5tYXRlcmlhbHM/Lmxlbmd0aCB8fCBwcm9kdWN0Py5iYXNlV2VpZ2h0KVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3Q/Lm1hdGVyaWFscz8uWzBdPy5wdXJpdHlcIj57eyBwcm9kdWN0Lm1hdGVyaWFsc1swXS5wdXJpdHkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8ubWF0ZXJpYWxzPy5bMF0/LnB1cml0eSAmJiBwcm9kdWN0Py5iYXNlV2VpZ2h0XCI+IMK3IDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0Py5iYXNlV2VpZ2h0XCI+e3sgcHJvZHVjdC5iYXNlV2VpZ2h0IH19Zzwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5kaXNwbGF5Py5zaG93QnV0dG9uICYmICFhcHBvaW50bWVudFNldHRpbmdzPy5ob21lVmlzaXRQcm9kdWN0c0VuYWJsZWQgJiYgcHJvZHVjdC5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPiAwXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJhZGQtdG8tY2FydC1idG5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIighcHJvZHVjdC5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KSkgJiYgSXNFY29tbWVyY2VcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRJdGVtVG9DYXJ0KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCI+QWRkIHRvIENhcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFJc0Vjb21tZXJjZVwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgW2JhY2tncm91bmRJbmZvXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIiAoY2xpY2spPVwicmFpc2VMZWFkKClcIj5Ob3RpZnkgTWU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1YW50aXR5IGZ1bGwtd2lkdGgtcXVhbnRpdHlcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJ0cnVlID8gJzEwMCUnIDogJydcIiAqbmdJZj1cInByb2R1Y3QucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2socHJvZHVjdClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYW5nZS1xdWFudGl0eVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRCdXR0b25TdHlsZSgxKT8udGV4dENvbG9yXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRJdGVtVG9DYXJ0KCRldmVudCwgcHJvZHVjdCwgJ1NVQlNUUkFDVCcpXCI+LTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIndpZHRoOiA3MCU7XCI+e3twcm9kdWN0LnF1YW50aXR5fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGFuZ2UtcXVhbnRpdHlcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCdXR0b25TdHlsZSgxKT8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiIChjbGljayk9XCJhZGRJdGVtVG9DYXJ0KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCI+Kzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJvdXQtb2Ytc3RvY2tcIiAqbmdJZj1cImlzSXRlbU91dE9mU3RvY2socHJvZHVjdClcIj5PdXQgT2YgU3RvY2s8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1idXR0b24tc2VjdGlvblwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvbiAmJiBhcHBvaW50bWVudFNldHRpbmdzPy5ob21lVmlzaXRQcm9kdWN0c0VuYWJsZWQgJiYgcHJvZHVjdD8uaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWF0LWhvbWVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gcC0yXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVG9UcmlhbENhcnQocHJvZHVjdClcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiPlRSWSBBVFxyXG4gICAgICAgICAgICAgICAgSE9NRTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWNhbGwtaW1hZ2VcIj5cclxuICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNTc4NjA2YzE3NTM0NTA4MTAyNjJ2aWRlb19DYWxsLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICBhbHQ9XCJ2aWRlb1wiIChjbGljayk9XCJhZGRWaWRlb0NhbGxDdXJyZW50KHByb2R1Y3QpXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2NyZWVuV2lkdGggPCA0NzUgJiYgc3R5bGVzPy5tb2JpbGVDb2x1bW4gPT09IDE7IGVsc2UgdGhlbWUxc3R5bGUxXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZWZ0XCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57eyBwcm9kdWN0Lm5hbWUgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTYgdGV4dC1zdGFydFwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAgICB7e3Byb2R1Y3Q/LnByaWNlPy5zZWxsaW5nUHJpY2UgfCBudW1iZXI6JzEuMC0wJ319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTQ1XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvbiAmJiAhYXBwb2ludG1lbnRTZXR0aW5ncz8uaG9tZVZpc2l0UHJvZHVjdHNFbmFibGVkICYmIHByb2R1Y3QuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLXRvLWNhcnQtYnRuIHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCJcclxuICAgICAgICAgICAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIoIXByb2R1Y3QucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2socHJvZHVjdCkpICYmIElzRWNvbW1lcmNlXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkSXRlbVRvQ2FydCgkZXZlbnQsIHByb2R1Y3QsICdBREQnKVwiPkFkZCB0byBDYXJ0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhSXNFY29tbWVyY2VcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCIgKGNsaWNrKT1cInJhaXNlTGVhZCgpXCI+Tm90aWZ5IE1lPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eSBmdWxsLXdpZHRoLXF1YW50aXR5IGJyLThcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJ0cnVlID8gJzEwMCUnIDogJydcIiAqbmdJZj1cInByb2R1Y3QucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2socHJvZHVjdClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYW5nZS1xdWFudGl0eSB3LTM1IGJyLThcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCdXR0b25TdHlsZSgxKT8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkSXRlbVRvQ2FydCgkZXZlbnQsIHByb2R1Y3QsICdTVUJTVFJBQ1QnKVwiPi08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogNzAlO1wiPnt7cHJvZHVjdC5xdWFudGl0eX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhbmdlLXF1YW50aXR5IHctMzUgYnItOFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRCdXR0b25TdHlsZSgxKT8udGV4dENvbG9yXCIgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj4rPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cIm91dC1vZi1zdG9jayB3LTEwMFwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KVwiPk91dCBPZiBTdG9jazwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWJ1dHRvbi1zZWN0aW9uIHctMTAwXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5kaXNwbGF5Py5zaG93QnV0dG9uICYmIGFwcG9pbnRtZW50U2V0dGluZ3M/LmhvbWVWaXNpdFByb2R1Y3RzRW5hYmxlZCAmJiBwcm9kdWN0Py5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktYXQtaG9tZVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biBwLTJcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUb1RyaWFsQ2FydChwcm9kdWN0KVwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCI+VFJZIEFUXHJcbiAgICAgICAgICAgICAgICBIT01FPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tY2FsbC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy81Nzg2MDZjMTc1MzQ1MDgxMDI2MnZpZGVvX0NhbGwuc3ZnXCJcclxuICAgICAgICAgICAgICAgIGFsdD1cInZpZGVvXCIgKGNsaWNrKT1cImFkZFZpZGVvQ2FsbEN1cnJlbnQocHJvZHVjdClcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGgtMTAwIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxyXG4gICAgICAgICAgW3NyY109XCJnZXRQcm9kdWN0SW1hZ2VzKHByb2R1Y3QpXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LWgtMTEwXCIgW2NsYXNzLmZhZGUtb3V0XT1cImltYWdlSW5kZXggPT0gaW5kZXhcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QpXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuXHJcblxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuIl19
|
|
1330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBNkIsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRWhKLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBS3hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFrQixhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFL0QsT0FBTyxFQUFrQixvQkFBb0IsRUFBcUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFZLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDeEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUVBQXVFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdEdEUsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFdBQVc7SUFxRm5ELGFBQWE7UUFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDdkMsQ0FBQztJQUdELGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztJQUNqRixDQUFDO0lBRUQsWUFDK0IsVUFBa0IsRUFDOUIsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLGNBQThCLEVBQzlCLGNBQXFDLEVBQ3JDLGNBQThCLEVBQzlCLFNBQW9CLEVBQ3BCLFdBQXdCLEVBQ3hCLGNBQThCLEVBQ3ZDLFFBQW1CLEVBQ1YsZ0JBQWtDLEVBQ2xDLHlCQUFvRDtRQUVyRSxLQUFLLEVBQUUsQ0FBQztRQWRxQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUN2QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ1YscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBMUc5RCxpQkFBWSxHQUFlLEVBQUUsQ0FBQztRQVF2QyxnQkFBVyxHQUFpQyxFQUFFLENBQUM7UUFHL0MsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBSWpDLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFDdEIsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3BCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFFaEIsY0FBUyxHQUFtQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQzNDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLGtCQUFhLEdBQVUsRUFBRSxDQUFBO1FBQ3pCLHNCQUFpQixHQUFVLEVBQUUsQ0FBQTtRQUM3QixtQkFBYyxHQUFHO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTthQUMxQjtZQUNELEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDcEQsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRTtZQUNyRDtnQkFDRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQjthQUNqRDtTQUNGLENBQUM7UUFFRixnR0FBZ0c7UUFDaEcsbUZBQW1GO1FBQ2xFLHNCQUFpQixHQUFHLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEUsbUJBQWMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWxHLDRFQUE0RTtRQUM1RSx1QkFBa0IsR0FBa0IsRUFBRSxDQUFDO1FBQ3ZDLDJCQUFzQixHQUF1QyxFQUFFLENBQUM7UUFDaEUsMEJBQXFCLEdBQTJELEVBQUUsQ0FBQztRQUNuRix5QkFBb0IsR0FBK0IsRUFBRSxDQUFDO1FBQzlDLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFFL0MsbUZBQW1GO1FBQ25GLHlGQUF5RjtRQUN6RixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBRWxDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFFdkIsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBQ25CLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixVQUFLLEdBQUcsZ0JBQWdCLENBQUM7UUFDekIsVUFBSyxHQUFzQixJQUFJLENBQUM7UUFFaEMsd0JBQW1CLEdBQVcsbUJBQW1CLENBQUM7UUFFMUMseUJBQW9CLEdBQXNDLElBQUksQ0FBQztRQUMvRCxxQkFBZ0IsR0FBc0MsSUFBSSxDQUFDO1FBQ25FLGVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUM5QixXQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUV6QixlQUFVLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUF1Q3hCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFVZiwyREFBMkQ7UUFDM0QsZ0JBQVcsR0FBRztZQUNaLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ25FLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3JFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzFFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1NBQzlFLENBQUM7UUFFRixrQkFBYSxHQUF5QjtZQUNwQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFB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QURaLFlBQVk7dUJBQUMsZUFBZTtnQkFNN0IsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkE0K0JJLFlBQVk7c0JBQXhELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBQTEFURk9STV9JRCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBIb3N0TGlzdGVuZXIsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDdXN0b21GaWVsZEZpbHRlciwgRmlsdGVyRGVmLCBGaWx0ZXJHcm91cCwgSXRlbVZhcmlhbnQsIFByb2R1Y3QgfSBmcm9tICcuLi8uLi9zdHlsZXMvcHJvZHVjdC5tb2RhbCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2FuaW1hdGlvbi1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbnRlbnRGaXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29udGVudC1maXQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2ltcG9Db21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2luZGV4JztcclxuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcclxuaW1wb3J0IHsgUHJvZHVjdExpc3RDb250ZW50TW9kYWwsIFByb2R1Y3RMaXN0TW9kYWwsIFByb2R1Y3RMaXN0U3R5bGVzTW9kYWwgfSBmcm9tICcuL3Byb2R1Y3QtbGlzdC5tb2RhbCc7XHJcbmltcG9ydCB7IEV2ZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZE1vZGVsLCBCdXR0b25Nb2RlbCwgTGF5T3V0TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xyXG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBwYXJzZUxpc3RQYXRoLCBzbHVnRnJvbU5hbWUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9saXN0LXJvdXRlLnV0aWwnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBQYWduaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ25pbmF0aW9uL3BhZ25pbmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXRCb3R0b21TaGVldCwgTWF0Qm90dG9tU2hlZXRNb2R1bGUsIE1hdEJvdHRvbVNoZWV0UmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcclxuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XHJcbmltcG9ydCB7IEZvcm1hdGVBbW91bnQgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9hbW91bnQucGlwZSc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Jvb2tpbmctcHJvZHVjdC1jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IEJhY2tncm91bmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYmFja2dyb3VuZC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTcGVlZERpYWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NwZWVkZGlhbCc7XHJcbmltcG9ydCB7IFNtYWxsUHJvZHVjdExpc3RpbmdDb21wb25lbnQgfSBmcm9tIFwiLi4vc21hbGwtcHJvZHVjdC1saXN0aW5nL3NtYWxsLXByb2R1Y3QtbGlzdGluZy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUHJvZHVjdENhcmRUaGVtZSB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9pbmRleCc7XHJcbmltcG9ydCB7IENhcmRTa2VsZXRvbkxvYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL2NhcmQtc2tlbGV0b24tbG9hZGVyL2NhcmQtc2tlbGV0b24tbG9hZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBCdXR0b25FZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWVkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9zcGFjaW5nLWhvcml6b250YWwuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBmb3JrSm9pbiwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW50ZXJmYWNlIEJhc2VNb2RlbCB7XHJcbiAgb3B0aW9uOiBzdHJpbmcsXHJcbiAgaWQ6IHN0cmluZyxcclxuICBpbWdVcmw6IHN0cmluZyxcclxuICBzdGF0dXM6IGJvb2xlYW4sXHJcbiAgc2x1Zz86IHN0cmluZ1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUmF0aW5nRmlsdGVyT3B0aW9uIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIG1pbjogbnVtYmVyO1xyXG4gIG1heDogbnVtYmVyO1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtbGlzdCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgTWF0U2xpZGVyTW9kdWxlLFxyXG4gICAgQW5pbWF0aW9uRGlyZWN0aXZlLFxyXG4gICAgU3BlZWREaWFsTW9kdWxlLFxyXG4gICAgQmFja2dyb3VuZERpcmVjdGl2ZSxcclxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXHJcbiAgICBIb3ZlckRpcmVjdGl2ZSxcclxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRCb3R0b21TaGVldE1vZHVsZSxcclxuICAgIE1hdFJhZGlvTW9kdWxlLFxyXG4gICAgRm9ybWF0ZUFtb3VudCxcclxuICAgIFRvYXN0TW9kdWxlLFxyXG4gICAgQ2FyZFNrZWxldG9uTG9hZGVyQ29tcG9uZW50LFxyXG4gICAgU21hbGxQcm9kdWN0TGlzdGluZ0NvbXBvbmVudCxcclxuICAgIENvbG9yRGlyZWN0aXZlLFxyXG4gICAgTWF0Q2hpcHNNb2R1bGUsXHJcbiAgICBCdXR0b25FZGl0b3JEaXJlY3RpdmUsXHJcbiAgICBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSxcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TGlzdENvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSByZXNwb25zZURhdGE/OiBQcm9kdWN0W10gPSBbXTtcclxuICBASW5wdXQoKSBkYXRhPzogUHJvZHVjdExpc3RNb2RhbDtcclxuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcclxuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkZWxldGU/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5leHRDb21wb25lbnRDb2xvcj86IEJhY2tncm91bmRNb2RlbDtcclxuXHJcbiAgdGFnSW5kZXhNYXA6IHsgW2l0ZW1JZDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBwcml2YXRlIHRhZ0ludGVydmFsOiBhbnk7XHJcblxyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFwaUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0xpc3RMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBbGxMaXN0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnRlbnQ/OiBQcm9kdWN0TGlzdENvbnRlbnRNb2RhbDtcclxuICBidXR0b24/OiBCdXR0b25Nb2RlbDtcclxuICB0b3RhbFBhZ2VzOiBudW1iZXIgPSAwO1xyXG4gIHNjcm9sbGluZ1ZhbHVlOiBudW1iZXIgPSAwO1xyXG4gIHByaWNpbmdNaW46IG51bWJlciA9IDA7XHJcbiAgcHJpY2luZ01heDogbnVtYmVyID0gMDtcclxuICBtaW5SYXRpbmc6IG51bWJlciA9IDA7XHJcbiAgbWF4UmF0aW5nOiBudW1iZXIgPSAwO1xyXG4gIHNvcnRCeTogc3RyaW5nID0gJyc7XHJcbiAgc2VhcmNoVGV4dDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdID0gW107XHJcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSA9IFtdO1xyXG4gIG1pblByb2R1Y3RQcmljZTogbnVtYmVyID0gMDtcclxuICBtYXhQcm9kdWN0UHJpY2U6IG51bWJlciA9IDA7XHJcbiAgZmlsdGVyZWRDaGlwczogYW55W10gPSBbXVxyXG4gIGZpbHRlcmVkUHJpY2VDaGlwOiBhbnlbXSA9IFtdXHJcbiAgZmlsdGVyaW5nQXJyYXkgPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IFwiTGF0ZXN0XCIsIHZhbHVlOiAnJyxcclxuICAgIH0sXHJcbiAgICB7IG5hbWU6IFwiUHJpY2U6IExvdyB0byBIaWdoXCIsIHZhbHVlOiBcImxvd2VzdFByaWNlXCIgfSxcclxuICAgIHsgbmFtZTogXCJQcmljZTogSGlnaCB0byBMb3dcIiwgdmFsdWU6IFwiaGlnaGVzdFByaWNlXCIgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ0N1c3RvbWVyIHJhdGluZycsIHZhbHVlOiAnY3VzdG9tZXJSYXRpbmcnXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgLy8gRmlsdGVycyB0aGUgc2VydmVyIGFscmVhZHkgbWFwcyBvbnRvIGJyYW5kSWQgLyBtaW5QcmljZSttYXhQcmljZSAvIGNhdGVnb3J5SWQgLyBjb2xsZWN0aW9uSWQuXHJcbiAgLy8gVGhlIGxlZ2FjeSBibG9ja3MgZHJpdmUgdGhvc2UsIHNvIHRoZXkgbXVzdCBuZXZlciBiZSBzZW50IGluIGN1c3RvbUZpZWxkRmlsdGVycy5cclxuICBwcml2YXRlIHJlYWRvbmx5IFNZU1RFTV9GSUxURVJfSURTID0gWydicmFuZCcsICdzZWxsaW5nUHJpY2UnLCAnY2F0ZWdvcnknLCAnY29sbGVjdGlvbiddO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgQlVJTFRfSU5fU09SVFMgPSBbJycsICduZXdlc3QnLCAnbG93ZXN0UHJpY2UnLCAnaGlnaGVzdFByaWNlJywgJ2N1c3RvbWVyUmF0aW5nJ107XHJcblxyXG4gIC8vIFNlcnZlci1kcml2ZW4gZmlsdGVyIGdyb3VwcyAocXVlcnktb3B0aW9ucyksIG1pbnVzIHRoZSBzeXN0ZW0gb25lcyBhYm92ZS5cclxuICBjdXN0b21GaWx0ZXJHcm91cHM6IEZpbHRlckdyb3VwW10gPSBbXTtcclxuICBjdXN0b21DaG9pY2VTZWxlY3Rpb25zOiB7IFtpZGVudGlmaWVyOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgY3VzdG9tUmFuZ2VTZWxlY3Rpb25zOiB7IFtpZGVudGlmaWVyOiBzdHJpbmddOiB7IG1pbjogc3RyaW5nLCBtYXg6IHN0cmluZyB9IH0gPSB7fTtcclxuICBjdXN0b21Hcm91cENvbGxhcHNlZDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICBwcml2YXRlIGZpbHRlck9wdGlvbnNLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBDYXRlZ29yeS9jb2xsZWN0aW9uIHRva2VucyBmcm9tIHRoZSBVUkwgdGhhdCBtYXRjaGVkIG5vdGhpbmcgaW4gdGhlIGxvYWRlZCBsaXN0c1xyXG4gIC8vICh0aGUgY2F0ZWdvcnkgbGlzdCBpcyBcImZlYXR1cmVkXCIgb25seSkuIFNlbnQgYXMgY2F0ZWdvcnlTbHVnTmFtZSAvIGNvbGxlY3Rpb25TbHVnTmFtZS5cclxuICB1cmxDYXRlZ29yeVNsdWdzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHVybENvbGxlY3Rpb25TbHVnczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgc2NyZWVuV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgZmlsdGVyTGlzdDogYW55W10gPSBbXTtcclxuICBzdHlsZXM/OiBQcm9kdWN0TGlzdFN0eWxlc01vZGFsO1xyXG4gIHRvdGFsQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgcGFnZU5vOiBudW1iZXIgPSAxO1xyXG4gIHNpemU6IG51bWJlciA9IDIwO1xyXG4gIHNlYXJjaFR4dDogc3RyaW5nID0gXCJcIjtcclxuICB0aGVtZSA9IFByb2R1Y3RDYXJkVGhlbWU7XHJcbiAgaXRlbXM6IE1lbnVJdGVtW10gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgbGF0ZXN0QW5hbHlpY3NFdmVudDogc3RyaW5nID0gJ1BST0RVQ1RfTElTVF9WSUVXJztcclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJCb3R0b21TaGVldFJlZjogTWF0Qm90dG9tU2hlZXRSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHNvcnRpbmdEaWFsb2dSZWY6IE1hdEJvdHRvbVNoZWV0UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcmllczogQmFzZU1vZGVsW10gPSBbXTtcclxuICBjb2xsZWN0aW9uczogQmFzZU1vZGVsW10gPSBbXTtcclxuICBicmFuZHM6IEJhc2VNb2RlbFtdID0gW107XHJcblxyXG4gIGltYWdlSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICBAVmlld0NoaWxkKCdsaXN0U2Nyb2xsQ29udGFpbmVyJykgbGlzdFNjcm9sbENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIGdldFNjcmVlblNpemUoKSB7XHJcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcclxuICBvbldpbmRvd1Njcm9sbChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuc2Nyb2xsaW5nVmFsdWUgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0Qm90dG9tU2hlZXQ6IE1hdEJvdHRvbVNoZWV0LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2U6IEJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmdldFNjcmVlblNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzdHlsZXNMYXlvdXQoKSB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnN0eWxlcz8ubGF5b3V0IH0gYXMgTGF5T3V0TW9kZWw7XHJcbiAgfVxyXG5cclxuICBpc09wZW4gPSBmYWxzZTtcclxuXHJcbiAgdG9nZ2xlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcclxuICB9XHJcblxyXG4gIGNsb3NlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gQWRkIHRoZXNlIGNsYXNzLWxldmVsIHByb3BlcnRpZXMgaWYgbm90IGFscmVhZHkgcHJlc2VudDpcclxuICBwcmljZVJhbmdlcyA9IFtcclxuICAgIHsgbGFiZWw6ICfigrkxLDAwMCAtIOKCuTUsMDAwJywgbWluOiAxMDAwLCBtYXg6IDUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ+KCuTUsMDAwIC0g4oK5MTUsMDAwJywgbWluOiA1MDAwLCBtYXg6IDE1MDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrkxNSwwMDAgLSDigrkyNSwwMDAnLCBtaW46IDE1MDAwLCBtYXg6IDI1MDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrkyNSwwMDAgLSDigrkzMCwwMDAnLCBtaW46IDI1MDAwLCBtYXg6IDMwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrkzMCwwMDAgLSDigrk1MCwwMDAnLCBtaW46IDMwMDAwLCBtYXg6IDUwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrk1MCwwMDAgLSDigrk3NSwwMDAnLCBtaW46IDUwMDAwLCBtYXg6IDc1MDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrk3NSwwMDAgLSDigrkxLDAwLDAwMCcsIG1pbjogNzUwMDAsIG1heDogMTAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrkxLDAwLDAwMCAtIOKCuTIsMDAsMDAwJywgbWluOiAxMDAwMDAsIG1heDogMjAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrkyLDAwLDAwMCAtIOKCuTMsMDAsMDAwJywgbWluOiAyMDAwMDAsIG1heDogMzAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrkzLDAwLDAwMCAtIOKCuTQsMDAsMDAwJywgbWluOiAzMDAwMDAsIG1heDogNDAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrk0LDAwLDAwMCAtIOKCuTUsMDAsMDAwJywgbWluOiA0MDAwMDAsIG1heDogNTAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrk1LDAwLDAwMCAtIOKCuTYsMDAsMDAwJywgbWluOiA1MDAwMDAsIG1heDogNjAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfVxyXG4gIF07XHJcblxyXG4gIHJhdGluZ09wdGlvbnM6IFJhdGluZ0ZpbHRlck9wdGlvbltdID0gW1xyXG4gICAgeyBsYWJlbDogJzUgU3RhcnMnLCBtaW46IDUsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAnNCBTdGFycyBhYm92ZScsIG1pbjogNCwgbWF4OiA1LCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICczIFN0YXJzIGFib3ZlJywgbWluOiAzLCBtYXg6IDUsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJzIgU3RhcnMgYWJvdmUnLCBtaW46IDIsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAnMSBTdGFyIGFib3ZlJywgbWluOiAxLCBtYXg6IDUsIHNlbGVjdGVkOiBmYWxzZSB9XHJcbiAgXTtcclxuXHJcbiAgLy8gQ2FsbGVkIHdoZW4gdXNlciBjaGFuZ2VzIHByaWNlIHJhbmdlIHNlbGVjdGlvblxyXG4gIG9uUHJpY2VSYW5nZUNoYW5nZShpbmRleD86IG51bWJlcikge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSYW5nZXMgPSB0aGlzLnByaWNlUmFuZ2VzXHJcbiAgICAgIC5maWx0ZXIocmFuZ2UgPT4gcmFuZ2Uuc2VsZWN0ZWQpXHJcbiAgICAgIC5tYXAocmFuZ2UgPT4gKHsgbWluOiByYW5nZS5taW4sIG1heDogcmFuZ2UubWF4IH0pKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWRSYW5nZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIC8vIE5vIHByaWNlIGZpbHRlciBhY3RpdmUsIHJlc2V0IG1pbi9tYXggdG8gdGhlIGZ1bGwgcmFuZ2VcclxuICAgICAgdGhpcy5wcmljaW5nTWluID0gdGhpcy5taW5Qcm9kdWN0UHJpY2U7XHJcbiAgICAgIHRoaXMucHJpY2luZ01heCA9IHRoaXMubWF4UHJvZHVjdFByaWNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQ2FsY3VsYXRlIGNvbWJpbmVkIG1pbiBhbmQgbWF4IGZyb20gc2VsZWN0ZWQgcmFuZ2VzIOKAlFxyXG4gICAgICAvLyBzZXQgcHJpY2luZ01pbiBhcyBzbWFsbGVzdCBtaW4gZnJvbSBjaGVja2VkIHJhbmdlcyxcclxuICAgICAgLy8gcHJpY2luZ01heCBhcyBsYXJnZXN0IG1heCBmcm9tIGNoZWNrZWQgcmFuZ2VzXHJcbiAgICAgIHRoaXMucHJpY2luZ01pbiA9IE1hdGgubWluKC4uLnNlbGVjdGVkUmFuZ2VzLm1hcChyID0+IHIubWluKSk7XHJcbiAgICAgIHRoaXMucHJpY2luZ01heCA9IE1hdGgubWF4KC4uLnNlbGVjdGVkUmFuZ2VzLm1hcChyID0+IHIubWF4KSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcmljZVJhbmdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICBpZiAoaSAhPT0gaW5kZXgpIHtcclxuICAgIC8vICAgICB0aGlzLnByaWNlUmFuZ2VzW2ldLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgdGhpcy5wcmljaW5nTWluID0gTWF0aC5taW4oLi4udGhpcy5wcmljZVJhbmdlcy5maWx0ZXIociA9PiByLnNlbGVjdGVkKS5tYXAociA9PiByLm1pbikpO1xyXG4gICAgLy8gICB0aGlzLnByaWNpbmdNYXggPSBNYXRoLm1heCguLi50aGlzLnByaWNlUmFuZ2VzLmZpbHRlcihyID0+IHIuc2VsZWN0ZWQpLm1hcChyID0+IHIubWF4KSk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICBdO1xyXG4gICAgLy8gWW91IGNhbiBhdXRvLXRyaWdnZXIgZmlsdGVyIG9yIG9ubHkgb24gYnV0dG9uIGNsaWNrICh5b3VyIGNob2ljZSlcclxuICAgIC8vIEZvciBhdXRvIGZpbHRlciB1bmNvbW1lbnQgbmV4dCBsaW5lOlxyXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG5cclxuICAgIC8vIEVsc2UsIGZpbHRlcmluZyBoYXBwZW5zIHdoZW4gdXNlciBjbGlja3MgXCJGaWx0ZXJcIiBidXR0b25cclxuICB9XHJcblxyXG4gIG9uUmF0aW5nQ2hhbmdlKHNlbGVjdGVkUmF0aW5nOiBSYXRpbmdGaWx0ZXJPcHRpb24pIHtcclxuICAgIHNlbGVjdGVkUmF0aW5nLnNlbGVjdGVkID0gIXNlbGVjdGVkUmF0aW5nLnNlbGVjdGVkO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSYXRpbmdzID0gdGhpcy5yYXRpbmdPcHRpb25zLmZpbHRlcigocmF0aW5nKSA9PiByYXRpbmcuc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZFJhdGluZ3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMubWluUmF0aW5nID0gMDtcclxuICAgICAgdGhpcy5tYXhSYXRpbmcgPSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5taW5SYXRpbmcgPSBNYXRoLm1pbiguLi5zZWxlY3RlZFJhdGluZ3MubWFwKChyYXRpbmcpID0+IHJhdGluZy5taW4pKTtcclxuICAgICAgdGhpcy5tYXhSYXRpbmcgPSBNYXRoLm1heCguLi5zZWxlY3RlZFJhdGluZ3MubWFwKChyYXRpbmcpID0+IHJhdGluZy5tYXgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxyXG4gICAgXTtcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vIE1vZGlmeSB5b3VyIGV4aXN0aW5nIGFwcGx5RmlsdGVyKCkgbWV0aG9kLCBhZGRpbmcgcHJpY2UgcmFuZ2UgbG9naWNcclxuICBhcHBseUZpbHRlcihjYXRlZ29yeT86IGFueSwgdHlwZT86ICdTT1JUJyB8ICdGSUxURVInKSB7XHJcbiAgICB0aGlzLnBhZ2VObyA9IDE7XHJcblxyXG4gICAgaWYgKHR5cGUgPT09ICdTT1JUJykge1xyXG4gICAgICB0aGlzLmxhdGVzdEFuYWx5aWNzRXZlbnQgPSAnU09SVF9BUFBMSUVEJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ0ZJTFRFUl9BUFBMSUVEJ1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFlvdXIgZXhpc3RpbmcgY2F0ZWdvcnkvZmlsdGVyIHRvZ2dsaW5nXHJcbiAgICBpZiAodHlwZSA9PT0gXCJGSUxURVJcIiAmJiBjYXRlZ29yeSkge1xyXG4gICAgICBjYXRlZ29yeS5zdGF0dXMgPSAhY2F0ZWdvcnkuc3RhdHVzO1xyXG4gICAgICAvLyBPbmNlIHRoZSBzaG9wcGVyIHBpY2tzIGZyb20gdGhlIHNpZGViYXIsIHRoZSBVUkwgc2x1Z3Mgbm8gbG9uZ2VyIGFwcGx5LlxyXG4gICAgICBpZiAodGhpcy5jYXRlZ29yaWVzLmluY2x1ZGVzKGNhdGVnb3J5KSB8fCB0aGlzLmNvbGxlY3Rpb25zLmluY2x1ZGVzKGNhdGVnb3J5KSkge1xyXG4gICAgICAgIHRoaXMudXJsQ2F0ZWdvcnlTbHVncyA9IFtdO1xyXG4gICAgICAgIHRoaXMudXJsQ29sbGVjdGlvblNsdWdzID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zS2V5ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLmZpbHRlcmVkQ2hpcHMucHVzaCh7bmFtZTogY2F0ZWdvcnkub3B0aW9uLCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nLCBpZDogY2F0ZWdvcnkuaWR9KVxyXG4gICAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxyXG4gICAgICBdO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyBEaXNtaXNzIGJvdHRvbSBzaGVldHMgaWYgb3BlblxyXG4gICAgdGhpcy5maWx0ZXJCb3R0b21TaGVldFJlZj8uZGlzbWlzcygpO1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmPy5kaXNtaXNzKCk7XHJcblxyXG4gICAgLy8gTm93IHRyaWdnZXIgZmlsdGVyaW5nIHdpdGggY3VycmVudCBzdGF0ZSBpbmNsdWRpbmcgcHJpY2UgZmlsdGVyc1xyXG4gICAgdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gTW9kaWZ5IGZpbHRlckl0ZW1MaXN0IHRvIHNlbmQgdGhlIGNvcnJlY3QgcHJpY2UgbWluIGFuZCBtYXg6XHJcbiAgcmFpc2VMZWFkKCkge1xyXG4gICAgY29uc3QgdXNlckRldGFpbHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpLFxyXG4gICAgICBlbWFpbDogdXNlckRldGFpbHM/LmNvbnRhY3Q/LmVtYWlsLFxyXG4gICAgICBtZXNzYWdlOiBcIlwiLFxyXG4gICAgICBtb2JpbGVObzogXCJcIixcclxuICAgICAgbW9yZUluZm86IHtcclxuICAgICAgICBOYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZSxcclxuICAgICAgICBcIk1vYmlsZSBOdW1iZXJcIjogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm1vYmlsZSxcclxuICAgICAgICBFbWFpbDogdXNlckRldGFpbHM/LmNvbnRhY3Q/LmVtYWlsLFxyXG4gICAgICAgIFwiTGVhZCBTb3VyY2VcIjogXCJXZWJzaXRlXCIsXHJcbiAgICAgICAgXCJMZWFkIFN0YXR1c1wiOiBcIk5FV1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIG5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNyZWF0ZUxlYWQocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnVGhhbmsgeW91JywgZGV0YWlsOiAnT3VyIHRlYW0gd2lsbCBjb250YWN0IHlvdSBzb29uJyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdFcnJvciBvY2N1cmVkIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXInIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcHJpY2VSYW5nZUZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmaWx0ZXJJdGVtTGlzdCgpIHtcclxuICAgIHRoaXMuYXBpTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VObyA9IDE7XHJcbiAgICB0aGlzLmlzQWxsTGlzdExvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZXNwb25zZURhdGEgPSBbXTtcclxuXHJcbiAgICB0aGlzLmZldGNoQW5hbHl0aWNzKCk7XHJcbiAgICB0aGlzLmxvYWRGaWx0ZXJPcHRpb25zKCk7XHJcblxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRGaWx0ZXJlZFByb2R1Y3QoXHJcbiAgICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpLFxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpLFxyXG4gICAgICB0aGlzLnNlYXJjaFRleHQsXHJcbiAgICAgIHRoaXMucHJpY2luZ01pbixcclxuICAgICAgdGhpcy5wcmljaW5nTWF4LFxyXG4gICAgICB0aGlzLm1pblJhdGluZyxcclxuICAgICAgdGhpcy5tYXhSYXRpbmcsXHJcbiAgICAgIHRoaXMuc29ydEJ5ID8/IFwiXCIsXHJcbiAgICAgIHRoaXMucGFnZU5vIC0gMSxcclxuICAgICAgdGhpcy5zaXplLFxyXG4gICAgICB0aGlzLmJyYW5kcy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4geC5pZCksXHJcbiAgICAgIHRoaXMuY3VzdG9tU2VhcmNoT3B0aW9uc1xyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZS5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXNwb25zZS5jb3VudCA/PyAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnByaWNlUmFuZ2VGbGFnKSB7XHJcbiAgICAgICAgdGhpcy5keW5hbWljUHJpY2VSYW5nZShyZXNwb25zZS5taW5QcmljZSwgcmVzcG9uc2UubWF4UHJpY2UpO1xyXG4gICAgICAgIHRoaXMucHJpY2VSYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNBbGxMaXN0TG9hZGVkID0gKHRoaXMucmVzcG9uc2VEYXRhPy5sZW5ndGggPz8gMCkgPj0gdGhpcy50b3RhbENvdW50O1xyXG4gICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGRhdGVQcm9kdWN0Q2FydFdpc2hsaXN0UHJvcGVydGllcygpO1xyXG4gICAgfSwgX2VyciA9PiB7XHJcbiAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gRXh0cmEgc2VhcmNoIGJvZHkgcHJvcGVydGllcyBmb3IgdGhlIHNlcnZlci1kcml2ZW4gZmlsdGVycyBhbmQgY3VzdG9tIHNvcnRzLlxyXG4gIHByaXZhdGUgZ2V0IGN1c3RvbVNlYXJjaE9wdGlvbnMoKToge1xyXG4gICAgY3VzdG9tRmllbGRGaWx0ZXJzOiBDdXN0b21GaWVsZEZpbHRlcltdLFxyXG4gICAgc29ydERpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnLFxyXG4gICAgY2F0ZWdvcnlTbHVnTmFtZT86IHN0cmluZ1tdLFxyXG4gICAgY29sbGVjdGlvblNsdWdOYW1lPzogc3RyaW5nW11cclxuICB9IHtcclxuICAgIGNvbnN0IGN1c3RvbUZpZWxkRmlsdGVyczogQ3VzdG9tRmllbGRGaWx0ZXJbXSA9IFtdO1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jdXN0b21DaG9pY2VTZWxlY3Rpb25zKS5mb3JFYWNoKChbaWRlbnRpZmllciwgdmFsdWVzXSkgPT4ge1xyXG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCkgY3VzdG9tRmllbGRGaWx0ZXJzLnB1c2goeyBpZGVudGlmaWVyLCB2YWx1ZXMgfSk7XHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zKS5mb3JFYWNoKChbaWRlbnRpZmllciwgcmFuZ2VdKSA9PiB7XHJcbiAgICAgIGlmIChyYW5nZS5taW4gIT09ICcnIHx8IHJhbmdlLm1heCAhPT0gJycpIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXI6IEN1c3RvbUZpZWxkRmlsdGVyID0geyBpZGVudGlmaWVyIH07XHJcbiAgICAgICAgaWYgKHJhbmdlLm1pbiAhPT0gJycpIGZpbHRlci5taW4gPSByYW5nZS5taW47XHJcbiAgICAgICAgaWYgKHJhbmdlLm1heCAhPT0gJycpIGZpbHRlci5tYXggPSByYW5nZS5tYXg7XHJcbiAgICAgICAgY3VzdG9tRmllbGRGaWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBBIGN1c3RvbS1maWVsZCBzb3J0IGtleSBuZWVkcyBhIGRpcmVjdGlvbjsgdGhlIGZvdXIgYnVpbHQtaW4gc29ydHMgbXVzdCBub3Qgc2VuZCBvbmUuXHJcbiAgICBjb25zdCBpc0N1c3RvbVNvcnQgPSAhdGhpcy5CVUlMVF9JTl9TT1JUUy5pbmNsdWRlcyh0aGlzLnNvcnRCeSA/PyAnJyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjdXN0b21GaWVsZEZpbHRlcnMsXHJcbiAgICAgIHNvcnREaXJlY3Rpb246IGlzQ3VzdG9tU29ydCA/ICdhc2MnIDogdW5kZWZpbmVkLFxyXG4gICAgICBjYXRlZ29yeVNsdWdOYW1lOiB0aGlzLnVybENhdGVnb3J5U2x1Z3MsXHJcbiAgICAgIGNvbGxlY3Rpb25TbHVnTmFtZTogdGhpcy51cmxDb2xsZWN0aW9uU2x1Z3NcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyBSZWxvYWRzIHNpZGViYXIgZ3JvdXBzICsgc29ydHMgZnJvbSBxdWVyeS1vcHRpb25zIHdoZW4gdGhlIGFjdGl2ZSBjYXRlZ29yeS9jb2xsZWN0aW9uIGNoYW5nZXMuXHJcbiAgLy8gQW4gdW5zZWVkZWQgYnVzaW5lc3MgKG9yIGFueSBmYWlsdXJlKSBsZWF2ZXMgdGhlIGxlZ2FjeSBzaWRlYmFyIGFuZCBmb3VyIGJ1aWx0LWluIHNvcnRzIGFzIGlzLlxyXG4gIHByaXZhdGUgbG9hZEZpbHRlck9wdGlvbnMoKSB7XHJcbiAgICAvLyBPbmUgY2FsbCBzY29wZXMgYnkgZXZlcnkgc2VsZWN0ZWQgY2F0ZWdvcnkvY29sbGVjdGlvbjogaWRzIGFuZCBzbHVncyBhcmUgYXJyYXlzIGluIHRoZSBib2R5IGFuZFxyXG4gICAgLy8gYXJlIGNvbWJpbmVkLiBBIFVSTCBzbHVnIHRoYXQgbWF0Y2hlZCBubyBsb2FkZWQgY2F0ZWdvcnkvY29sbGVjdGlvbiAoZS5nLiBvbmUgb3V0c2lkZSB0aGVcclxuICAgIC8vIGZlYXR1cmVkIGxpc3QpIGdvZXMgaW4gYXMgYSBzbHVnLlxyXG4gICAgY29uc3Qgc2NvcGUgPSB7XHJcbiAgICAgIGNhdGVnb3J5SWRzOiB0aGlzLmNhdGVnb3JpZXMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpLFxyXG4gICAgICBjb2xsZWN0aW9uSWRzOiB0aGlzLmNvbGxlY3Rpb25zLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKSxcclxuICAgICAgY2F0ZWdvcnlTbHVnTmFtZXM6IFsuLi50aGlzLnVybENhdGVnb3J5U2x1Z3NdLFxyXG4gICAgICBjb2xsZWN0aW9uU2x1Z05hbWVzOiBbLi4udGhpcy51cmxDb2xsZWN0aW9uU2x1Z3NdLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KHNjb3BlKTtcclxuICAgIGlmIChrZXkgPT09IHRoaXMuZmlsdGVyT3B0aW9uc0tleSkgcmV0dXJuO1xyXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zS2V5ID0ga2V5O1xyXG5cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RmlsdGVyT3B0aW9ucyhzY29wZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKG9wdGlvbnMpID0+IHtcclxuICAgICAgICBpZiAoa2V5ICE9PSB0aGlzLmZpbHRlck9wdGlvbnNLZXkpIHJldHVybjsgLy8gYSBuZXdlciBzZWxlY3Rpb24gYWxyZWFkeSByZXBsYWNlZCB0aGlzIG9uZVxyXG4gICAgICAgIGlmIChvcHRpb25zLnNvcnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJpbmdBcnJheSA9IG9wdGlvbnMuc29ydHMubWFwKHNvcnQgPT4gKHtcclxuICAgICAgICAgICAgbmFtZTogc29ydC5sYWJlbCxcclxuICAgICAgICAgICAgdmFsdWU6IHNvcnQua2V5ID09PSAnbmV3ZXN0JyA/ICcnIDogc29ydC5rZXlcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQnJhbmQgLyBDYXRlZ29yaWVzIC8gQ29sbGVjdGlvbnMgY29tZSBiYWNrIGFzIGdyb3VwcyB0b28uIFRoZXkgYXJlIGRyYXduIGZyb20gdGhlIEFQSVxyXG4gICAgICAgIC8vICh3aXRoIGNvdW50cykgYW5kIHNlbGVjdGluZyBvbmUgZHJpdmVzIHRoZSBzYW1lIHN0YXRlIHRoZSBsZWdhY3kgYmxvY2tzIHVzZSwgc28gdGhlXHJcbiAgICAgICAgLy8gc2VhcmNoIHN0aWxsIHNlbmRzIGJyYW5kSWQgLyBjYXRlZ29yeUlkIC8gY29sbGVjdGlvbklkLiBTZWxsaW5nIFByaWNlIGtlZXBzIHRoZSBsZWdhY3lcclxuICAgICAgICAvLyBwcmljZSBibG9jay4gQ3VzdG9tIGZpZWxkcyAoQ29sb3IsIC4uLikgYXJlIHNob3duIG9uIGpld2VsbGVyeSBwYWdlcyBhcyB3ZWxsLlxyXG4gICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyR3JvdXBzID0gb3B0aW9ucy5ncm91cHNcclxuICAgICAgICAgIC5tYXAoZ3JvdXAgPT4gKHtcclxuICAgICAgICAgICAgLi4uZ3JvdXAsXHJcbiAgICAgICAgICAgIGZpbHRlcnM6IGdyb3VwLmZpbHRlcnMuZmlsdGVyKGYgPT4gZi5pZGVudGlmaWVyICE9PSAnc2VsbGluZ1ByaWNlJylcclxuICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgLmZpbHRlcihncm91cCA9PiBncm91cC5maWx0ZXJzLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICB0aGlzLmFwaUZpbHRlcklkcyA9IG5ldyBTZXQodGhpcy5jdXN0b21GaWx0ZXJHcm91cHMuZmxhdE1hcChnID0+IGcuZmlsdGVycy5tYXAoZiA9PiBmLmlkZW50aWZpZXIpKSk7XHJcblxyXG4gICAgICAgIC8vIERyb3Agc2VsZWN0aW9ucyBmb3IgZmlsdGVycyB0aGF0IGRvIG5vdCBleGlzdCBvbiB0aGlzIHBhZ2UgYW55IG1vcmUuXHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gdGhpcy5hcGlGaWx0ZXJJZHM7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jdXN0b21DaG9pY2VTZWxlY3Rpb25zKS5mb3JFYWNoKGlkID0+IHsgaWYgKCFhdmFpbGFibGUuaGFzKGlkKSkgZGVsZXRlIHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tpZF07IH0pO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zKS5mb3JFYWNoKGlkID0+IHsgaWYgKCFhdmFpbGFibGUuaGFzKGlkKSkgZGVsZXRlIHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zW2lkXTsgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21GaWx0ZXJHcm91cHMgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnNLZXkgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIElkZW50aWZpZXJzIHRoZSBBUEkgcmV0dXJuZWQgZm9yIHRoaXMgcGFnZS4gQSBsZWdhY3kgYmxvY2sgaXMgaGlkZGVuIHdoZW4gdGhlIEFQSSBzdXBwbGllcyBpdC5cclxuICBhcGlGaWx0ZXJJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgaXNBcGlGaWx0ZXIoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlGaWx0ZXJJZHMuaGFzKGlkZW50aWZpZXIpO1xyXG4gIH1cclxuXHJcbiAgLy8gYnJhbmQgLyBjYXRlZ29yeSAvIGNvbGxlY3Rpb24gc2hhcmUgc3RhdGUgd2l0aCB0aGUgbGVnYWN5IHNpZGViYXIgYW5kIHNlYXJjaCBmaWVsZHMuXHJcbiAgcHJpdmF0ZSBzeXN0ZW1MaXN0KGlkZW50aWZpZXI6IHN0cmluZyk6IEJhc2VNb2RlbFtdIHwgbnVsbCB7XHJcbiAgICBpZiAoaWRlbnRpZmllciA9PT0gJ2NhdGVnb3J5JykgcmV0dXJuIHRoaXMuY2F0ZWdvcmllcztcclxuICAgIGlmIChpZGVudGlmaWVyID09PSAnY29sbGVjdGlvbicpIHJldHVybiB0aGlzLmNvbGxlY3Rpb25zO1xyXG4gICAgaWYgKGlkZW50aWZpZXIgPT09ICdicmFuZCcpIHJldHVybiB0aGlzLmJyYW5kcztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1N5c3RlbUxpc3RGaWx0ZXIoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zeXN0ZW1MaXN0KGlkZW50aWZpZXIpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgaXNDdXN0b21DaG9pY2VTZWxlY3RlZChpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGxpc3QgPSB0aGlzLnN5c3RlbUxpc3QoaWRlbnRpZmllcik7XHJcbiAgICBpZiAobGlzdCkgcmV0dXJuIGxpc3Quc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IHZhbHVlICYmIGl0ZW0uc3RhdHVzKTtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnNbaWRlbnRpZmllcl0/LmluY2x1ZGVzKHZhbHVlKSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUN1c3RvbUNob2ljZShmaWx0ZXI6IEZpbHRlckRlZiwgdmFsdWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMuc3lzdGVtTGlzdChmaWx0ZXIuaWRlbnRpZmllcik7XHJcbiAgICBpZiAobGlzdCkge1xyXG4gICAgICBsZXQgaXRlbSA9IGxpc3QuZmluZCh4ID0+IHguaWQgPT09IHZhbHVlKTtcclxuICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgLy8gZS5nLiBhIGNhdGVnb3J5IG91dHNpZGUgdGhlIGZlYXR1cmVkIGxpc3Q6IGFkZCBpdCBzbyBpdCBpcyBzZWxlY3RhYmxlIGFuZCBzZWFyY2hhYmxlXHJcbiAgICAgICAgY29uc3QgY2hvaWNlID0gZmlsdGVyLmNob2ljZXM/LmZpbmQoYyA9PiBjLnZhbHVlID09PSB2YWx1ZSk7XHJcbiAgICAgICAgaXRlbSA9IHsgb3B0aW9uOiBjaG9pY2U/LmxhYmVsID8/IHZhbHVlLCBpZDogdmFsdWUsIGltZ1VybDogJycsIHN0YXR1czogZmFsc2UgfTtcclxuICAgICAgICBsaXN0LnB1c2goaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hcHBseUZpbHRlcihpdGVtLCAnRklMVEVSJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnNbZmlsdGVyLmlkZW50aWZpZXJdID8/IFtdO1xyXG4gICAgLy8gQk9PTEVBTiBpcyBhIHllcy9ubywgc28gb25seSBvbmUgdmFsdWUgYXQgYSB0aW1lLlxyXG4gICAgY29uc3Qgc2luZ2xlID0gZmlsdGVyLmNvbnRyb2wgPT09ICdCT09MRUFOJztcclxuICAgIHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl0gPSBjdXJyZW50LmluY2x1ZGVzKHZhbHVlKVxyXG4gICAgICA/IGN1cnJlbnQuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXHJcbiAgICAgIDogc2luZ2xlID8gW3ZhbHVlXSA6IFsuLi5jdXJyZW50LCB2YWx1ZV07XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBjdXN0b21SYW5nZShpZGVudGlmaWVyOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVJhbmdlU2VsZWN0aW9uc1tpZGVudGlmaWVyXSA/PyB7IG1pbjogJycsIG1heDogJycgfTtcclxuICB9XHJcblxyXG4gIHNldEN1c3RvbVJhbmdlKGlkZW50aWZpZXI6IHN0cmluZywgZWRnZTogJ21pbicgfCAnbWF4JywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpIHtcclxuICAgIGNvbnN0IHJhbmdlID0geyAuLi50aGlzLmN1c3RvbVJhbmdlKGlkZW50aWZpZXIpIH07XHJcbiAgICByYW5nZVtlZGdlXSA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWx1ZSkudHJpbSgpO1xyXG4gICAgdGhpcy5jdXN0b21SYW5nZVNlbGVjdGlvbnNbaWRlbnRpZmllcl0gPSByYW5nZTtcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vIENoaXBzIGZvciBzZXJ2ZXItZHJpdmVuIGZpbHRlcnMsIHNob3duIG5leHQgdG8gdGhlIGxlZ2FjeSBvbmVzLlxyXG4gIGdldCBzZWxlY3RlZEN1c3RvbUNoaXBzKCkge1xyXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuY3VzdG9tRmlsdGVyR3JvdXBzLmZsYXRNYXAoZyA9PiBnLmZpbHRlcnMpO1xyXG4gICAgY29uc3QgY2hpcHM6IHsgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgICBmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcclxuICAgICAgKHRoaXMuY3VzdG9tQ2hvaWNlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl0gPz8gW10pLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZmlsdGVyLmNob2ljZXM/LmZpbmQoYyA9PiBjLnZhbHVlID09PSB2YWx1ZSk/LmxhYmVsID8/IHZhbHVlO1xyXG4gICAgICAgIGNoaXBzLnB1c2goeyBpZDogYGN1c3RvbS0ke2ZpbHRlci5pZGVudGlmaWVyfS0ke3ZhbHVlfWAsIG5hbWU6IGxhYmVsLCB0eXBlOiAnY3VzdG9tJywgaWRlbnRpZmllcjogZmlsdGVyLmlkZW50aWZpZXIsIHZhbHVlIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmN1c3RvbVJhbmdlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl07XHJcbiAgICAgIGlmIChyYW5nZSAmJiAocmFuZ2UubWluICE9PSAnJyB8fCByYW5nZS5tYXggIT09ICcnKSkge1xyXG4gICAgICAgIGNoaXBzLnB1c2goe1xyXG4gICAgICAgICAgaWQ6IGBjdXN0b20tJHtmaWx0ZXIuaWRlbnRpZmllcn0tcmFuZ2VgLFxyXG4gICAgICAgICAgbmFtZTogYCR7ZmlsdGVyLmxhYmVsfTogJHtyYW5nZS5taW4gfHwgZmlsdGVyLm1pbiB8fCAwfSAtICR7cmFuZ2UubWF4IHx8IGZpbHRlci5tYXggfHwgJ2FueSd9YCxcclxuICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgaWRlbnRpZmllcjogZmlsdGVyLmlkZW50aWZpZXJcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY2hpcHM7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheUNoaXBzKCkge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmZpbHRlcmVkQ2hpcHMsIC4uLnRoaXMuc2VsZWN0ZWRDdXN0b21DaGlwc107XHJcbiAgfVxyXG5cclxuICBkeW5hbWljUHJpY2VSYW5nZShtaW5QcmljZTogbnVtYmVyLCBtYXhQcmljZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnByaWNlUmFuZ2VzID0gW107XHJcbiAgICBjb25zdCByYW5nZSA9IG1heFByaWNlIC0gbWluUHJpY2U7XHJcbiAgICBjb25zdCBzdGVwID0gcmFuZ2UgLyA1O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcclxuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLnJvdW5kKChtaW5QcmljZSArIGkgKiBzdGVwKSAvIDEwMCkgKiAxMDA7XHJcbiAgICAgIGNvbnN0IGVuZCA9IGkgPT09IDRcclxuICAgICAgICA/IE1hdGgucm91bmQobWF4UHJpY2UgLyAxMDApICogMTAwXHJcbiAgICAgICAgOiBNYXRoLnJvdW5kKChtaW5QcmljZSArIChpICsgMSkgKiBzdGVwKSAvIDEwMCkgKiAxMDA7XHJcbiAgICAgIHRoaXMucHJpY2VSYW5nZXMucHVzaCh7IGxhYmVsOiBg4oK5JHtzdGFydH0gLSDigrkke2VuZH1gLCBtaW46IHN0YXJ0LCBtYXg6IGVuZCwgc2VsZWN0ZWQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdE9wdGlvbihmaWx0ZXI6IGFueSwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAgLy8gUHJldmVudCBjbG9zaW5nIHR3aWNlXHJcbiAgICB0aGlzLnNvcnRCeSA9IGZpbHRlci52YWx1ZTtcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoeyB2YWx1ZTogZmlsdGVyLnZhbHVlIH0sICdTT1JUJyk7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWROYW1lKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZmlsdGVyaW5nQXJyYXkuZmluZChmID0+IGYudmFsdWUgPT09IHRoaXMuc29ydEJ5KTtcclxuICAgIHJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkLm5hbWUgOiAnJztcclxuICB9XHJcblxyXG4gIGhhbmRsZVByb2R1Y3RMaXN0U2Nyb2xsKCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmxpc3RTY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWVsIHx8IHRoaXMuaXNMaXN0TG9hZGluZyB8fCB0aGlzLmlzQWxsTGlzdExvYWRlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDE1MDsgLy8gSW5jcmVhc2VkIHRocmVzaG9sZCBmb3Igc21vb3RoZXIgbG9hZGluZ1xyXG4gICAgaWYgKGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8IHRocmVzaG9sZCkge1xyXG4gICAgICB0aGlzLmxvYWRNb3JlUHJvZHVjdHNUb0xpc3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRNb3JlUHJvZHVjdHNUb0xpc3QoKSB7XHJcbiAgICBpZiAodGhpcy5pc0xpc3RMb2FkaW5nIHx8IHRoaXMuaXNBbGxMaXN0TG9hZGVkKSByZXR1cm47XHJcbiAgICB0aGlzLmlzTGlzdExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYWdlTm8rKztcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YSAmJiB0aGlzLnJlc3BvbnNlRGF0YS5sZW5ndGggPj0gdGhpcy50b3RhbENvdW50KSB7XHJcbiAgICAgIHRoaXMuaXNBbGxMaXN0TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc0xpc3RMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RmlsdGVyZWRQcm9kdWN0KFxyXG4gICAgICB0aGlzLmNvbGxlY3Rpb25zLmZpbHRlcigoeCkgPT4geC5zdGF0dXMpLm1hcCgoeCkgPT4geC5pZCksXHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKHgpID0+IHguc3RhdHVzKS5tYXAoKHgpID0+IHguaWQpLFxyXG4gICAgICB0aGlzLnNlYXJjaFRleHQsXHJcbiAgICAgIHRoaXMucHJpY2luZ01pbixcclxuICAgICAgdGhpcy5wcmljaW5nTWF4LFxyXG4gICAgICB0aGlzLm1pblJhdGluZyxcclxuICAgICAgdGhpcy5tYXhSYXRpbmcsXHJcbiAgICAgIHRoaXMuc29ydEJ5ID8/IFwiXCIsXHJcbiAgICAgIHRoaXMucGFnZU5vIC0gMSxcclxuICAgICAgdGhpcy5zaXplLFxyXG4gICAgICB0aGlzLmJyYW5kcy5maWx0ZXIoKHgpID0+IHguc3RhdHVzKS5tYXAoKHgpID0+IHguaWQpLFxyXG4gICAgICB0aGlzLmN1c3RvbVNlYXJjaE9wdGlvbnNcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gWy4uLih0aGlzLnJlc3BvbnNlRGF0YSA/PyBbXSksIC4uLihyZXNwb25zZS5kYXRhID8/IFtdKV07XHJcbiAgICAgIHRoaXMudG90YWxDb3VudCA9IHJlc3BvbnNlLmNvdW50O1xyXG4gICAgICB0aGlzLmlzQWxsTGlzdExvYWRlZCA9ICh0aGlzLnJlc3BvbnNlRGF0YT8ubGVuZ3RoID8/IDApID49IHRoaXMudG90YWxDb3VudDtcclxuICAgICAgdGhpcy5pc0xpc3RMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9LCBfZXJyID0+IHtcclxuICAgICAgdGhpcy5pc0xpc3RMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBlY29tQ29uZmlnczogYW55O1xyXG4gIGdldEVjb21tZXJjZUNvbmZpZ3MoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEVjb21tZXJjZUNvbmZpZ3MoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyBXaGV0aGVyIFRyeSBhdCBIb21lIC8gVmlkZW8gQ2FsbCBhcmUgb2ZmZXJlZCBpcyBhbiBBcHBvaW50bWVudC1hcHAgc2V0dGluZ1xyXG4gIC8vIChob21lVmlzaXRQcm9kdWN0c0VuYWJsZWQvdmlkZW9DYWxsUHJvZHVjdHNFbmFibGVkKSwgbm90IGEgd2Vic2l0ZS1zZXR0aW5ncyB0b2dnbGUuXHJcbiAgYXBwb2ludG1lbnRTZXR0aW5nczogYW55ID0gbnVsbDtcclxuICBnZXRBcHBvaW50bWVudFNldHRpbmdzKCkge1xyXG4gICAgY29uc3QgYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgPz8gJyc7XHJcbiAgICBpZiAoIWJ1c2luZXNzSWQpIHJldHVybjtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QnVzaW5lc3NBcHBvaW50bWVudFNldHRpbmdzKGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5hcHBvaW50bWVudFNldHRpbmdzID0gcmVzO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICAvLyBOb24tZmF0YWwgLSBUcnkgYXQgSG9tZSBidXR0b24ganVzdCBzdGF5cyBoaWRkZW4uXHJcbiAgICB9KTtcclxuICB9XHJcbiAgdG9TaG93SW5KZXdlbGxlcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBJc0Vjb21tZXJjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTWF0ZXJpYWxCYXNlZFByaWNpbmcgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmdldEVjb21tZXJjZUNvbmZpZ3MoKTtcclxuICAgIHRoaXMuZ2V0QXBwb2ludG1lbnRTZXR0aW5ncygpO1xyXG4gICAgaWYgKHdpbmRvdz8ubG9jYXRpb24/Lm9yaWdpbj8uaW5jbHVkZXMoJ2NhcmF0bGFuZScpIHx8IHdpbmRvdz8ubG9jYXRpb24/Lm9yaWdpbj8uaW5jbHVkZXMoJ29ycmEnKSkge1xyXG4gICAgICB0aGlzLnRvU2hvd0luSmV3ZWxsZXJ5ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNNYXRlcmlhbEJhc2VkUHJpY2luZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdpc01hdGVyaWFsQmFzZWRQcmljaW5nJykgPT09ICd0cnVlJztcclxuXHJcbiAgICB0aGlzLml0ZW1zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaG9wcGluZy1jYXJ0XCIsXHJcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpY29uOiBcInBpIHBpLWhvbWVcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy5jb250ZW50ID0gdGhpcy5kYXRhPy5jb250ZW50O1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXTtcclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuSXNFY29tbWVyY2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIndlYnNpdGVUeXBlXCIpICE9ICdTVEFUSUMnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5nZXRBbGxDYXRlZ29yaWVzKCk7XHJcbiAgICAvLyB0aGlzLmdldEFsbENvbGxlY3Rpb25zKCk7XHJcbiAgICB0aGlzLm1pblByb2R1Y3RQcmljZSA9IHRoaXMucHJpY2luZ01pbiA9IHRoaXMuZGF0YT8uc3R5bGVzLm1pblByaWNlID8/IDA7XHJcbiAgICB0aGlzLm1heFByb2R1Y3RQcmljZSA9IHRoaXMucHJpY2luZ01heCA9IHRoaXMuZGF0YT8uc3R5bGVzLm1heFByaWNlID8/IDMwMDAwO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcInNlYXJjaFR4dFwiXTtcclxuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChxUGFyYW06IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSBxUGFyYW1bXCJzZWFyY2hUeHRcIl07XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hUZXh0KVxyXG4gICAgICAgIHRoaXMubGF0ZXN0QW5hbHlpY3NFdmVudCA9ICdTRUFSQ0gnO1xyXG5cclxuICAgICAgdGhpcy5wYWdlTm8gPSBxUGFyYW1bXCJwYWdlTm9cIl0gPyBOdW1iZXIocVBhcmFtW1wicGFnZU5vXCJdKSA6IDE7XHJcbiAgICAgIHRoaXMuc29ydEJ5ID0gcVBhcmFtW1wic29ydGluZ1wiXSA/PyBcIlwiO1xyXG4gICAgICB0aGlzLnByaWNpbmdNaW4gPSBpc05hTihOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pKSA/IDAgOiBOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pO1xyXG4gICAgICB0aGlzLnByaWNpbmdNYXggPSBpc05hTihOdW1iZXIocVBhcmFtW1wibWF4UHJpY2VcIl0pKSA/IDAgOiBOdW1iZXIocVBhcmFtW1wibWF4UHJpY2VcIl0pO1xyXG4gICAgICAvLyB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtW1wiY2F0ZWdvcnlcIl0sIHFQYXJhbVtcImNvbGxlY3Rpb25zXCJdKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdO1xyXG4gICAgdGhpcy5nZXRDYXRlZ29yaWVzQW5kQ29sbGVjdGlvbigpO1xyXG5cclxuICAgIC8vIHRoaXMuZmlsdGVySXRlbUxpc3QoKTtcclxuICB9XHJcblxyXG4gIGZldGNoQW5hbHl0aWNzKCkge1xyXG4gICAgbGV0IGFuYWx5dGljc0V2ZW50OiBhbnkgPSB7fVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCkge1xyXG4gICAgICBhbmFseXRpY3NFdmVudFsnU0VBUkNIJ10gPSB0aGlzLnNlYXJjaFRleHRcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnByaWNpbmdNaW4pIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01JTl9QUklDRSddID0gdGhpcy5wcmljaW5nTWluO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHJpY2luZ01heCkge1xyXG4gICAgICBhbmFseXRpY3NFdmVudFsnTUFYX1BSSUNFJ10gPSB0aGlzLnByaWNpbmdNYXg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydEJ5KSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydTT1JUX0JZJ10gPSB0aGlzLnNvcnRCeTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5taW5SYXRpbmcpIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01JTl9SQVRJTkcnXSA9IHRoaXMubWluUmF0aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1heFJhdGluZykge1xyXG4gICAgICBhbmFseXRpY3NFdmVudFsnTUFYX1JBVElORyddID0gdGhpcy5tYXhSYXRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYW5hbHl0aWNzRXZlbnRbJ0NBVEVHT1JJRVMnXSA9IHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4geC5pZClcclxuXHJcbiAgICBhbmFseXRpY3NFdmVudFsnQ09MTEVDVElPTlMnXSA9IHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpO1xyXG5cclxuICAgIGNvbnN0IGN1c3RvbUZpbHRlcnMgPSB0aGlzLmN1c3RvbVNlYXJjaE9wdGlvbnMuY3VzdG9tRmllbGRGaWx0ZXJzO1xyXG4gICAgaWYgKGN1c3RvbUZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydDVVNUT01fRklMVEVSUyddID0gY3VzdG9tRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc3RhcnROZXdDb250ZXh0KGFuYWx5dGljc0V2ZW50LCB0aGlzLmxhdGVzdEFuYWx5aWNzRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2F0ZWdvcmllc0FuZENvbGxlY3Rpb24oKSB7XHJcbiAgICBmb3JrSm9pbihbXHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ29sbGVjdGlvbnMoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb2xsZWN0aW9ucyBmYWlsZWRcIiwgZXJyKTtcclxuICAgICAgICAgIHJldHVybiBvZihbXSk7ICAgLy8gZmFsbGJhY2sgZW1wdHkgYXJyYXlcclxuICAgICAgICB9KVxyXG4gICAgICApLFxyXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbENhdGVnb3JpZXMoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXRlZ29yaWVzIGZhaWxlZFwiLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTsgICAvLyBmYWxsYmFjayBlbXB0eSBhcnJheVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQnJhbmRzKCkucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJhbmRzIGZhaWxlZFwiLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTsgICAvLyBmYWxsYmFjayBlbXB0eSBhcnJheVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgIF0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlc1sxXS5maWx0ZXIoKGNhdGVnb3J5OiBhbnkpID0+IGNhdGVnb3J5LmZlYXR1cmVkQ29sbGVjdGlvbiB8fCB0cnVlKS5tYXAoKGNhdGVnb3J5OiBhbnkpID0+IHsgcmV0dXJuIHsgb3B0aW9uOiBjYXRlZ29yeS5jYXRlZ29yeU5hbWUsIGlkOiBjYXRlZ29yeS5jYXRlZ29yeUlkLCBpbWdVcmw6IGNhdGVnb3J5LmltZ1VybD8uWzBdLCBzdGF0dXM6IGZhbHNlLCBzbHVnOiBjYXRlZ29yeS5zbHVnTmFtZSB9IH0pO1xyXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSByZXNbMF0uZmlsdGVyKChjb2xsZWN0aW9uOiBhbnkpID0+IGNvbGxlY3Rpb24uZmVhdHVyZWRDYXRlZ29yeSB8fCB0cnVlKS5tYXAoKGNvbGxlY3Rpb246IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUsIGlkOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25JZCwgc3RhdHVzOiBmYWxzZSwgc2x1ZzogY29sbGVjdGlvbi5zbHVnTmFtZSB9IH0pO1xyXG4gICAgICAgIHRoaXMuYnJhbmRzID0gKHJlc1syXSA/PyBbXSkubWFwKChicmFuZDogYW55KSA9PiB7IHJldHVybiB7IG9wdGlvbjogYnJhbmQuYnJhbmROYW1lLCBpZDogYnJhbmQuYnJhbmRJZCwgaW1nVXJsOiBicmFuZC5pbWdVcmw/LlswXSwgc3RhdHVzOiBmYWxzZSB9IH0pO1xyXG5cclxuICAgICAgICBjb25zdCBxUGFyYW1CcmFuZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJicmFuZFwiXTtcclxuICAgICAgICBjb25zdCB7IGNhdGVnb3J5LCBjb2xsZWN0aW9ucyB9ID0gdGhpcy5yZXNvbHZlTGlzdFJvdXRlUGFyYW1zKCk7XHJcbiAgICAgICAgdGhpcy5saXN0c0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5sYXN0TGlzdFBhdGggPSB0aGlzLmN1cnJlbnRMaXN0UGF0aCgpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShjYXRlZ29yeSwgY29sbGVjdGlvbnMsIHFQYXJhbUJyYW5kKTtcclxuXHJcbiAgICAgICAgLy8gL2xpc3QvYSAtPiAvbGlzdC9iIGtlZXBzIHRoaXMgY29tcG9uZW50IGFsaXZlLCBzbyByZS1hcHBseSB3aGVuIHRoZSBwYXRoIGNoYW5nZXMuXHJcbiAgICAgICAgdGhpcy5saXN0UGF0aFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLmxpc3RQYXRoU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzXHJcbiAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmN1cnJlbnRMaXN0UGF0aCgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdHNMb2FkZWQgfHwgcGF0aCA9PT0gdGhpcy5sYXN0TGlzdFBhdGggfHwgIXBhdGguc3RhcnRzV2l0aCgnbGlzdCcpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMubGFzdExpc3RQYXRoID0gcGF0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVMaXN0Um91dGVQYXJhbXMoKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKFxyXG4gICAgICAgICAgICAgIHJlc29sdmVkLmNhdGVnb3J5LFxyXG4gICAgICAgICAgICAgIHJlc29sdmVkLmNvbGxlY3Rpb25zLFxyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJicmFuZFwiXVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaXN0c0xvYWRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdExpc3RQYXRoID0gJyc7XHJcbiAgcHJpdmF0ZSBsaXN0UGF0aFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLy8gUGF0aCBwYXJ0IG9mIHRoZSBVUkwgZnJvbSBgbGlzdGAgb253YXJkcywgdXNlZCB0byBkZXRlY3QgL2xpc3QvYSAtPiAvbGlzdC9iIG5hdmlnYXRpb24uXHJcbiAgcHJpdmF0ZSBjdXJyZW50TGlzdFBhdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBwYXJzZUxpc3RQYXRoKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkuam9pbignLycpID8gJ2xpc3QvJyArIHBhcnNlTGlzdFBhdGgod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKS5qb2luKCcvJykgOiAnbGlzdCc7XHJcbiAgfVxyXG5cclxuICAvLyBDYXRlZ29yeS9jb2xsZWN0aW9uIGZvciB0aGUgcGFnZTogcGF0aCBzZWdtZW50cyAoL2xpc3Qve2NhdGVnb3J5fS97Y29sbGVjdGlvbn0pIGZpcnN0LCB0aGVuIHRoZVxyXG4gIC8vIGxlZ2FjeSA/Y2F0ZWdvcnk9IC8gP2NvbGxlY3Rpb25zPSBxdWVyeSBwYXJhbXMgc28gb2xkIGxpbmtzIGtlZXAgd29ya2luZy5cclxuICBwcml2YXRlIHJlc29sdmVMaXN0Um91dGVQYXJhbXMoKTogeyBjYXRlZ29yeTogYW55LCBjb2xsZWN0aW9uczogYW55IH0ge1xyXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xyXG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXJzZUxpc3RQYXRoKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XHJcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKVxyXG4gICAgICByZXR1cm4geyBjYXRlZ29yeTogcXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXSwgY29sbGVjdGlvbnM6IHF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl0gfTtcclxuXHJcbiAgICBjb25zdCBtYXRjaGVzID0gKGxpc3Q6IEJhc2VNb2RlbFtdLCBzZWdtZW50OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgdG9rZW4gPSBzbHVnRnJvbU5hbWUoc2VnbWVudCk7XHJcbiAgICAgIHJldHVybiBsaXN0LnNvbWUoKGl0ZW0pID0+XHJcbiAgICAgICAgaXRlbS5zbHVnPy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbiB8fFxyXG4gICAgICAgIHNsdWdGcm9tTmFtZShpdGVtLm9wdGlvbikgPT09IHRva2VuKTtcclxuICAgIH07XHJcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID49IDIpXHJcbiAgICAgIHJldHVybiB7IGNhdGVnb3J5OiBzZWdtZW50c1swXSwgY29sbGVjdGlvbnM6IHNlZ21lbnRzWzFdIH07XHJcblxyXG4gICAgLy8gT25lIHNlZ21lbnQgaXMgZWl0aGVyIGEgY2F0ZWdvcnkgb3IgYSBjb2xsZWN0aW9uLiBDYXRlZ29yeSBmaXJzdDsgYSBzZWdtZW50IHRoYXQgbWF0Y2hlc1xyXG4gICAgLy8gbmVpdGhlciAoZS5nLiBhIGNhdGVnb3J5IG91dHNpZGUgdGhlIGZlYXR1cmVkIGxpc3QpIGdvZXMgdG8gdGhlIHNlcnZlciBhcyBhIGNhdGVnb3J5IHNsdWcuXHJcbiAgICBjb25zdCBbc2VnbWVudF0gPSBzZWdtZW50cztcclxuICAgIGlmICghbWF0Y2hlcyh0aGlzLmNhdGVnb3JpZXMsIHNlZ21lbnQpICYmIG1hdGNoZXModGhpcy5jb2xsZWN0aW9ucywgc2VnbWVudCkpXHJcbiAgICAgIHJldHVybiB7IGNhdGVnb3J5OiB1bmRlZmluZWQsIGNvbGxlY3Rpb25zOiBzZWdtZW50IH07XHJcbiAgICByZXR1cm4geyBjYXRlZ29yeTogc2VnbWVudCwgY29sbGVjdGlvbnM6IHVuZGVmaW5lZCB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMoKSB7XHJcbiAgICBjb25zdCBjaGlwczogeyBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yaWVzKSB7XHJcbiAgICAgIGNoaXBzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5jYXRlZ29yaWVzLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiAoe1xyXG4gICAgICAgICAgaWQ6IHguaWQsXHJcbiAgICAgICAgICBuYW1lOiB4Lm9wdGlvblxyXG4gICAgICAgIH0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbnMpIHtcclxuICAgICAgY2hpcHMucHVzaChcclxuICAgICAgICAuLi50aGlzLmNvbGxlY3Rpb25zLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiAoe1xyXG4gICAgICAgICAgaWQ6IHguaWQsXHJcbiAgICAgICAgICBuYW1lOiB4Lm9wdGlvblxyXG4gICAgICAgIH0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYnJhbmRzKSB7XHJcbiAgICAgIGNoaXBzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5icmFuZHMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+ICh7XHJcbiAgICAgICAgICBpZDogeC5pZCxcclxuICAgICAgICAgIG5hbWU6IHgub3B0aW9uXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpcHM7XHJcbiAgfVxyXG5cclxuICAvLyBDb21wdXRlZCBnZXR0ZXIgZm9yIHNlbGVjdGVkIHByaWNlIHJhbmdlIGNoaXBzXHJcbiAgZ2V0IHNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJpY2VSYW5nZXNcclxuICAgICAgLmZpbHRlcihwciA9PiBwci5zZWxlY3RlZClcclxuICAgICAgLm1hcChwciA9PiAoe1xyXG4gICAgICAgIGlkOiAncHJpY2UtJyArIHByLm1pbiArICctJyArIHByLm1heCxcclxuICAgICAgICBuYW1lOiBwci5sYWJlbCxcclxuICAgICAgICB0eXBlOiAncHJpY2UnXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFJhdGluZ0NoaXBzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmF0aW5nT3B0aW9uc1xyXG4gICAgICAuZmlsdGVyKHJhdGluZyA9PiByYXRpbmcuc2VsZWN0ZWQpXHJcbiAgICAgIC5tYXAocmF0aW5nID0+ICh7XHJcbiAgICAgICAgaWQ6ICdyYXRpbmctJyArIHJhdGluZy5taW4gKyAnLScgKyByYXRpbmcubWF4LFxyXG4gICAgICAgIG5hbWU6IHJhdGluZy5sYWJlbCxcclxuICAgICAgICB0eXBlOiAncmF0aW5nJ1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsQWN0aXZlQ2hpcHMoKSB7XHJcbiAgICBsZXQgZGF0YSA9IFtcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICBdO1xyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG4gIGdldEFsbENhdGVnb3JpZXMoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbENhdGVnb3JpZXMoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlc3BvbnNlLmZpbHRlcigoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnkuZmVhdHVyZWRDb2xsZWN0aW9uIHx8IHRydWUpLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNhdGVnb3J5LmNhdGVnb3J5TmFtZSwgaWQ6IGNhdGVnb3J5LmNhdGVnb3J5SWQsIGltZ1VybDogY2F0ZWdvcnkuaW1nVXJsPy5bMF0sIHN0YXR1czogZmFsc2UsIHNsdWc6IGNhdGVnb3J5LnNsdWdOYW1lIH0gfSk7XHJcbiAgICAgIGNvbnN0IHFQYXJhbUNvbGxlY3Rpb25zID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNvbGxlY3Rpb25zXCJdO1xyXG4gICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcclxuICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFQYXJhbUNhdGVnb3J5LCBxUGFyYW1Db2xsZWN0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEFsbENvbGxlY3Rpb25zKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDb2xsZWN0aW9ucygpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IHJlc3BvbnNlLmZpbHRlcigoY29sbGVjdGlvbjogYW55KSA9PiBjb2xsZWN0aW9uLmZlYXR1cmVkQ2F0ZWdvcnkgfHwgdHJ1ZSkubWFwKChjb2xsZWN0aW9uOiBhbnkpID0+IHsgcmV0dXJuIHsgb3B0aW9uOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25OYW1lLCBpZDogY29sbGVjdGlvbi5jb2xsZWN0aW9uSWQsIHN0YXR1czogZmFsc2UsIHNsdWc6IGNvbGxlY3Rpb24uc2x1Z05hbWUgfSB9KTtcclxuICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XHJcbiAgICAgIGNvbnN0IHFQYXJhbUNhdGVnb3J5ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNhdGVnb3J5XCJdO1xyXG4gICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtQ2F0ZWdvcnksIHFQYXJhbUNvbGxlY3Rpb25zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdENhcnRXaXNobGlzdFByb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJDYXJ0KCkudGhlbigoY2FydFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGNhcnRSZXNwb25zZS5vbnN1Y2Nlc3MgPSAoY2FydERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdIHx8IFtdO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhPy5mb3JFYWNoKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0Lml0ZW1JZCkge1xyXG4gICAgICAgICAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50ID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/LlswXTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcyA/PyBbXTtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHdpc2hsaXN0UmVzcG9uc2Uub25zdWNjZXNzID0gKHdoaXNsaXN0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXSB8fCBbXTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YT8uZm9yRWFjaCgocHJvZHVjdDogUHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QuaXRlbUlkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudD8udmFyaWFudEltYWdlcyA/PyBbXTtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0LndoaXNsaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFDYXRlZ29yaWVzOiBhbnksIHFDb2xsZWN0aW9uczogYW55LCBxQnJhbmRzPzogYW55KSB7XHJcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gcUNhdGVnb3JpZXM/LnNwbGl0KFwiK1wiKT8ubWFwKChjYXRlZ29yeTogc3RyaW5nKSA9PiBjYXRlZ29yeS5yZXBsYWNlQWxsKFwiX1wiLCBcIiBcIikudG9Mb3dlckNhc2UoKSkuZmlsdGVyKChjYXRlZ29yeTogc3RyaW5nKSA9PiBjYXRlZ29yeS5sZW5ndGggPiAwKTtcclxuICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gcUNvbGxlY3Rpb25zPy5zcGxpdChcIitcIik/Lm1hcCgoY29sbGVjdGlvbjogc3RyaW5nKSA9PiBjb2xsZWN0aW9uLnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGNvbGxlY3Rpb246IHN0cmluZykgPT4gY29sbGVjdGlvbi5sZW5ndGggPiAwKTtcclxuICAgIGNvbnN0IGJyYW5kcyA9IHFCcmFuZHM/LnNwbGl0KFwiK1wiKT8ubWFwKChicmFuZDogc3RyaW5nKSA9PiBicmFuZC5yZXBsYWNlQWxsKFwiX1wiLCBcIiBcIikudG9Mb3dlckNhc2UoKSkuZmlsdGVyKChicmFuZDogc3RyaW5nKSA9PiBicmFuZC5sZW5ndGggPiAwKTtcclxuXHJcbiAgICBpZiAoKGNhdGVnb3JpZXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHwgKGNvbGxlY3Rpb25zPy5sZW5ndGggPz8gMCkgPiAwIHx8IChicmFuZHM/Lmxlbmd0aCA/PyAwKSA+IDApXHJcbiAgICAgIHRoaXMubGF0ZXN0QW5hbHlpY3NFdmVudCA9ICdGSUxURVJfQVBQTElFRCc7XHJcblxyXG4gICAgLy8gQSBVUkwgdG9rZW4gaXMgYSBiYWNrZW5kIHNsdWdOYW1lIChgbWVucy13ZWFyYCkgb3IgdGhlIG9sZGVyIG5hbWUgZm9ybSAoYE1lbnNfV2VhcmApLlxyXG4gICAgLy8gVGhlIGxvYWRlZCBsaXN0IChmZWF0dXJlZCBjYXRlZ29yaWVzLCBjb2xsZWN0aW9ucykgbWF5IG5vdCBjYXJyeSBgc2x1Z05hbWVgLCBzbyB0aGUgbmFtZSBpc1xyXG4gICAgLy8gc2x1Z2lmaWVkIHRvbzogYG1lbnMtd2VhcmAgbXVzdCBtYXRjaCBhIGNhdGVnb3J5IG5hbWVkIFwiTWVucyBXZWFyXCIuXHJcbiAgICBjb25zdCB0b1NsdWcgPSAodG9rZW46IHN0cmluZykgPT4gc2x1Z0Zyb21OYW1lKHRva2VuKTtcclxuICAgIGNvbnN0IG1hdGNoZXNUb2tlbiA9IChpdGVtOiBCYXNlTW9kZWwsIHRva2Vuczogc3RyaW5nW10pID0+XHJcbiAgICAgIHRva2Vucy5zb21lKCh0b2tlbikgPT5cclxuICAgICAgICAoaXRlbS5zbHVnICYmIGl0ZW0uc2x1Zy50b0xvd2VyQ2FzZSgpID09PSB0b1NsdWcodG9rZW4pKSB8fFxyXG4gICAgICAgIHNsdWdGcm9tTmFtZShpdGVtLm9wdGlvbikgPT09IHRvU2x1Zyh0b2tlbikpO1xyXG5cclxuICAgIHRoaXMuY2F0ZWdvcmllcz8uZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcclxuICAgICAgY2F0ZWdvcnkuc3RhdHVzID0gbWF0Y2hlc1Rva2VuKGNhdGVnb3J5LCBjYXRlZ29yaWVzID8/IFtdKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucz8uZm9yRWFjaCgoY29sbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb2xsZWN0aW9uLnN0YXR1cyA9IG1hdGNoZXNUb2tlbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9ucyA/PyBbXSk7XHJcbiAgICB9KTtcclxuICAgIC8vIFRva2VucyB0aGF0IG1hdGNoZWQgbm90aGluZyBpbiB0aGUgbG9hZGVkIGxpc3RzIGdvIHRvIHRoZSBzZXJ2ZXIgYXMgc2x1Z3MuIEFuIHVua25vd24gc2x1Z1xyXG4gICAgLy8gcmV0dXJucyBubyByb3dzLCB3aGljaCBpcyB0aGUgaW50ZW5kZWQgZW1wdHkgc3RhdGUgZm9yIGEgYmFkIGxpbmsuXHJcbiAgICB0aGlzLnVybENhdGVnb3J5U2x1Z3MgPSAoY2F0ZWdvcmllcyA/PyBbXSlcclxuICAgICAgLmZpbHRlcigodG9rZW46IHN0cmluZykgPT4gIXRoaXMuY2F0ZWdvcmllcy5zb21lKChjKSA9PiBtYXRjaGVzVG9rZW4oYywgW3Rva2VuXSkpKVxyXG4gICAgICAubWFwKHRvU2x1Zyk7XHJcbiAgICB0aGlzLnVybENvbGxlY3Rpb25TbHVncyA9IChjb2xsZWN0aW9ucyA/PyBbXSlcclxuICAgICAgLmZpbHRlcigodG9rZW46IHN0cmluZykgPT4gIXRoaXMuY29sbGVjdGlvbnMuc29tZSgoYykgPT4gbWF0Y2hlc1Rva2VuKGMsIFt0b2tlbl0pKSlcclxuICAgICAgLm1hcCh0b1NsdWcpO1xyXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zS2V5ID0gbnVsbDtcclxuICAgIHRoaXMuYnJhbmRzPy5mb3JFYWNoKChicmFuZCkgPT4ge1xyXG4gICAgICBicmFuZC5zdGF0dXMgPSBicmFuZHM/LmluY2x1ZGVzKGJyYW5kPy5vcHRpb24/LnRvTG93ZXJDYXNlKCkpID8/IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxyXG4gICAgXTtcclxuICAgIC8vIERPIE5PVCByZWJ1aWxkIGZpbHRlckxpc3QgaGVyZSEgKENoaXBzIHdpbGwgYXV0by11cGRhdGUgZnJvbSBzdGF0dXMgYXJyYXlzIHZpYSB0aGUgZ2V0dGVyLilcclxuICAgIHRoaXMuZmlsdGVySXRlbUxpc3QoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbHRlcihmaWx0ZXI6IGFueSkge1xyXG4gICAgaWYgKGZpbHRlci50eXBlID09PSAnY3VzdG9tJykge1xyXG4gICAgICBpZiAoZmlsdGVyLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnNbZmlsdGVyLmlkZW50aWZpZXJdID1cclxuICAgICAgICAgICh0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnNbZmlsdGVyLmlkZW50aWZpZXJdID8/IFtdKS5maWx0ZXIodiA9PiB2ICE9PSBmaWx0ZXIudmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmN1c3RvbVJhbmdlU2VsZWN0aW9uc1tmaWx0ZXIuaWRlbnRpZmllcl07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbHRlci50eXBlID09PSAncHJpY2UnKSB7XHJcbiAgICAgIC8vIERlc2VsZWN0IHRoaXMgcHJpY2UgcmFuZ2UgYW5kIHRyaWdnZXIgZmlsdGVyXHJcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMucHJpY2VSYW5nZXMuZmluZEluZGV4KFxyXG4gICAgICAgIHByID0+IGZpbHRlci5pZCA9PT0gJ3ByaWNlLScgKyBwci5taW4gKyAnLScgKyBwci5tYXhcclxuICAgICAgKTtcclxuICAgICAgaWYgKGlkeCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5wcmljZVJhbmdlc1tpZHhdLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vblByaWNlUmFuZ2VDaGFuZ2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbHRlci50eXBlID09PSAncmF0aW5nJykge1xyXG4gICAgICBjb25zdCByYXRpbmcgPSB0aGlzLnJhdGluZ09wdGlvbnMuZmluZChyID0+IGZpbHRlci5pZCA9PT0gJ3JhdGluZy0nICsgci5taW4gKyAnLScgKyByLm1heCk7XHJcbiAgICAgIGlmIChyYXRpbmcpIHtcclxuICAgICAgICByYXRpbmcuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2VsZWN0ZWRSYXRpbmdzID0gdGhpcy5yYXRpbmdPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWxlY3RlZCk7XHJcbiAgICAgIHRoaXMubWluUmF0aW5nID0gc2VsZWN0ZWRSYXRpbmdzLmxlbmd0aCA/IE1hdGgubWluKC4uLnNlbGVjdGVkUmF0aW5ncy5tYXAoKGl0ZW0pID0+IGl0ZW0ubWluKSkgOiAwO1xyXG4gICAgICB0aGlzLm1heFJhdGluZyA9IHNlbGVjdGVkUmF0aW5ncy5sZW5ndGggPyBNYXRoLm1heCguLi5zZWxlY3RlZFJhdGluZ3MubWFwKChpdGVtKSA9PiBpdGVtLm1heCkpIDogMDtcclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcclxuICAgICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMucGFnZU5vID0gMTtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSA/PyBcIlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFzc3VtZSByZW1haW5pbmcgY2hpcHMgYXJlIGNhdGVnb3JpZXMgb3IgY29sbGVjdGlvbnNcclxuICAgIC8vIFJlbW92ZSBzZWxlY3Rpb24gYnkgaWRcclxuICAgIGlmICh0aGlzLmNhdGVnb3JpZXMpIHtcclxuICAgICAgY29uc3QgY2F0ID0gdGhpcy5jYXRlZ29yaWVzLmZpbmQoY2F0ID0+IGNhdC5pZCA9PT0gZmlsdGVyLmlkKTtcclxuICAgICAgaWYgKGNhdCkgY2F0LnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbnMpIHtcclxuICAgICAgY29uc3QgY29sbCA9IHRoaXMuY29sbGVjdGlvbnMuZmluZChjb2xsID0+IGNvbGwuaWQgPT09IGZpbHRlci5pZCk7XHJcbiAgICAgIGlmIChjb2xsKSBjb2xsLnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYnJhbmRzKSB7XHJcbiAgICAgIGNvbnN0IGJyYW5kID0gdGhpcy5icmFuZHMuZmluZChicmFuZCA9PiBicmFuZC5pZCA9PT0gZmlsdGVyLmlkKTtcclxuICAgICAgaWYgKGJyYW5kKSBicmFuZC5zdGF0dXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlTm8gPSAxO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSA/PyBcIlwiKTtcclxuICB9XHJcblxyXG4gIGFwcGx5UHJvZHVjdFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3R5bGVzPy50aGVtZSA9PT0gdGhpcy50aGVtZS5UaGVtZTEgfHxcclxuICAgICAgKHRoaXMuc2NyZWVuV2lkdGggPCA0NzUgJiYgdGhpcy5zdHlsZXM/LnRoZW1lID09IHRoaXMudGhlbWUuVGhlbWUyKVxyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuV2lkdGggPiA0NzUgPyAodGhpcy5zY3JlZW5XaWR0aCA8IDEwMjUgPyAnMjUlJyA6ICdjYWxjKCcgKyAoKDEwMCAvICh0aGlzLnN0eWxlcz8uZWxlbWVudEluUm93IHx8IDQpKSkgKyAnJSknKSA6ICh0aGlzLnN0eWxlcz8ubW9iaWxlQ29sdW1uID09PSAxID8gJzk4JScgOiAnNDglJylcclxuICB9XHJcblxyXG4gIHByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIGNvbnN0IHNsdWcgPSBwcm9kdWN0LnNsdWdpZmllZE5hbWUgfHwgdGhpcy50b1NsdWcocHJvZHVjdC5uYW1lKTtcclxuICAgIGlmICghc2x1ZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZGV0YWlscycsIHNsdWddKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9TbHVnKGlucHV0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWlucHV0KVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBub1doaXRlc3BhY2UgPSBpbnB1dC5yZXBsYWNlKC9cXHMrL2csICctJyk7XHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9XaGl0ZXNwYWNlLm5vcm1hbGl6ZSgnTkZEJyk7XHJcbiAgICBjb25zdCBzbHVnID0gbm9ybWFsaXplZC5yZXBsYWNlKC9bXlxcdy1dL2csICcnKTtcclxuXHJcbiAgICByZXR1cm4gc2x1Z1xyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxyXG4gICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpO1xyXG4gIH1cclxuXHJcbiAgcmluZ1NpemVzID0gW1xyXG4gICAgeyBzaXplOiAnQmFuZHMnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdDb2NrdGFpbCcsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0Nhc3VhbCBSaW5ncycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0hhbG8nLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdO1xyXG5cclxuICBwcm9kdWN0VHlwZXNEYXRhID0gW1xyXG4gICAgeyBzaXplOiAnRWFycmluZ3MnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdQZW5kYW50cycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ1JpbmdzJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnTmVja2xhY2VzJywgc3RhdHVzOiBmYWxzZSB9XHJcbiAgXVxyXG5cclxuICBzaG9wRm9yRGF0YSA9IFtcclxuICAgIHsgc2l6ZTogJ1dvbWVuJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnTWVuJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnQmFieScsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0tpZHMnLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdXHJcblxyXG4gIG1hdGVyaWFsU2l6ZURhdGEgPSBbXHJcbiAgICB7IHNpemU6ICdQbGF0aW51bScsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0dvbGQnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdEaWFtb25kJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnR2Vtc3RvbmUnLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdXHJcblxyXG4gIG1ldGFsU2l6ZURhdGEgPSBbXHJcbiAgICB7IHNpemU6ICcyMiBLVCBZZWxsb3cnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICcxOCBLVCBZZWxsb3cnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICc5IEtUIFllbGxvdycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJzE4IEtUIFdoaXRlJywgc3RhdHVzOiBmYWxzZSB9XHJcbiAgXVxyXG5cclxuICB0b2dnbGVNZXRhbFNpemUoc2l6ZTogYW55KSB7XHJcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNob3BTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQcm9kdWN0U2l6ZShzaXplOiBhbnkpIHtcclxuICAgIHNpemUuc3RhdHVzID0gIXNpemUuc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTWF0ZXJpYWxTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcigpIHtcclxuICAgIHRoaXMuY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMucHJpY2VSYW5nZXMuZm9yRWFjaChwciA9PiBwci5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHRoaXMucHJpY2luZ01pbiA9IHRoaXMubWluUHJvZHVjdFByaWNlO1xyXG4gICAgdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5tYXhQcm9kdWN0UHJpY2U7XHJcbiAgICB0aGlzLnJhdGluZ09wdGlvbnMuZm9yRWFjaCgocmF0aW5nKSA9PiByYXRpbmcuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICB0aGlzLm1pblJhdGluZyA9IDA7XHJcbiAgICB0aGlzLm1heFJhdGluZyA9IDA7XHJcbiAgICB0aGlzLnJpbmdTaXplcy5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMucHJvZHVjdFR5cGVzRGF0YS5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMuc2hvcEZvckRhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLm1hdGVyaWFsU2l6ZURhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLm1ldGFsU2l6ZURhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLmN1c3RvbUNob2ljZVNlbGVjdGlvbnMgPSB7fTtcclxuICAgIHRoaXMuY3VzdG9tUmFuZ2VTZWxlY3Rpb25zID0ge307XHJcbiAgICB0aGlzLnVybENhdGVnb3J5U2x1Z3MgPSBbXTtcclxuICAgIHRoaXMudXJsQ29sbGVjdGlvblNsdWdzID0gW107XHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnNLZXkgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW107XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2xpc3QnXSk7XHJcbiAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5KVxyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsdGVyU2Nyb2xsJywgeyBzdGF0aWM6IHRydWUgfSkgZmlsdGVyU2Nyb2xsITogRWxlbWVudFJlZjtcclxuXHJcbiAgaXNTeW5jaW5nID0gZmFsc2U7XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuZmlsdGVyU2Nyb2xsPy5uYXRpdmVFbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLmhhbmRsZVN5bmNTY3JvbGwoKSk7XHJcbiAgICB0aGlzLnN0YXJ0VGFnQ3ljbGUoKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0VGFnQ3ljbGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAodGhpcy5yZXNwb25zZURhdGEgfHwgW10pLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgaWYgKChwPy50YWdzPy5sZW5ndGggPz8gMCkgPiAxKSB7XHJcbiAgICAgICAgICBjb25zdCBjdXIgPSB0aGlzLnRhZ0luZGV4TWFwW3AuaXRlbUlkXSA/PyAwO1xyXG4gICAgICAgICAgdGhpcy50YWdJbmRleE1hcFtwLml0ZW1JZF0gPSAoY3VyICsgMSkgJSBwLnRhZ3MubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAzMDAwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRhZ0ludGVydmFsKTtcclxuICAgIHRoaXMubGlzdFBhdGhTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTeW5jU2Nyb2xsKCkge1xyXG4gICAgLy8gRG9uJ3QgcmVjdXJzaXZlbHkgdHJpZ2dlciBzY3JvbGxzXHJcbiAgICBpZiAodGhpcy5pc1N5bmNpbmcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJFbCA9IHRoaXMuZmlsdGVyU2Nyb2xsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBsaXN0RWwgPSB0aGlzLmxpc3RTY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIENhbGN1bGF0ZSB3aGVuIGZpbHRlciBoYXMgXCJzY3JvbGxlZCBwYXN0XCIgdGhlIGhlaWdodCBvZiB0aGUgcmlnaHQgc2lkZVxyXG4gICAgY29uc3QgZmlsdGVyU2Nyb2xsYWJsZUV4Y2VzcyA9IGZpbHRlckVsLnNjcm9sbEhlaWdodCAtIGZpbHRlckVsLmNsaWVudEhlaWdodDtcclxuICAgIGNvbnN0IGxpc3RTY3JvbGxhYmxlID0gbGlzdEVsLnNjcm9sbEhlaWdodCAtIGxpc3RFbC5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgaWYgKGZpbHRlckVsLnNjcm9sbFRvcCA+IGxpc3RTY3JvbGxhYmxlKSB7XHJcbiAgICAgIHRoaXMuaXNTeW5jaW5nID0gdHJ1ZTtcclxuICAgICAgLy8gU2Nyb2xsIHJpZ2h0IHNpZGUgaW4gc3luYyBhcyB3ZWxsXHJcbiAgICAgIGxpc3RFbC5zY3JvbGxUb3AgPSBmaWx0ZXJFbC5zY3JvbGxUb3AgLSAoZmlsdGVyU2Nyb2xsYWJsZUV4Y2VzcyAtIGxpc3RTY3JvbGxhYmxlKTtcclxuICAgICAgdGhpcy5pc1N5bmNpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICB0b2dnbGVJdGVtVG9GYXYoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQsIHByb2R1Y3Q6IFByb2R1Y3QsIHR5cGU6ICdBREQnIHwgJ1JFTU9WRScpIHtcclxuICAgIGlmICh0eXBlID09ICdBREQnKSB7XHJcbiAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdXaXNobGlzdCcsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB3aXNobGlzdCcgfSk7XHJcbiAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpO1xyXG4gICAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUocHJvZHVjdCBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZShwcm9kdWN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSBmYWxzZTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnV2lzaGxpc3QnLCBkZXRhaWw6ICdJdGVtIHJlbW92ZWQgZnJvbSB5b3VyIHdpc2hsaXN0JyB9KTtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZW1vdmVJdGVtRnJvbUZhdm91cml0ZShwcm9kdWN0LnZhcmllbnRJZCwgcHJvZHVjdC5pdGVtSWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb2R1Y3Qud2hpc2xpc3QpIHtcclxuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXMocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHRoaXMuVVNFUl9XSVNITElTVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IGl0ZW0udmFyaWVudElkICE9IHByb2R1Y3QudmFyaWVudElkKSA/PyBbXTtcclxuICAgIH1cclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgYWRkSXRlbVRvQ2FydChldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCwgcHJvZHVjdDogUHJvZHVjdCwgdHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJykge1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnd2FybicsIHN1bW1hcnk6ICdDYXJ0JywgZGV0YWlsOiAnSXRlbSBpcyBub3QgYXZhaWxhYmxlIGFzIG9mIG5vdy4gV2Ugd2lsbCBub3RpZnkgeW91IG9uY2UgYXZhaWxhYmxlJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcHJvZHVjdC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XHJcbiAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudChwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50LnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQocHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb2R1Y3QucXVhbnRpdHkpIHtcclxuICAgICAgbGV0IGlzUHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0udmFyaWVudElkID09IHByb2R1Y3QudmFyaWVudElkKSB7XHJcbiAgICAgICAgICBpdGVtLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAgICAgICAgIGlzUHJlc2VudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoIWlzUHJlc2VudClcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLlVTRVJfQ0FSVCA9IHRoaXMuVVNFUl9DQVJUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gcHJvZHVjdC52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoUHJvZHVjdCgpIHtcclxuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJcIik7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RWYXJpZW50KHByb2R1Y3Q6IFByb2R1Y3QsIHZhcmllbnQ6IEl0ZW1WYXJpYW50KSB7XHJcbiAgICBwcm9kdWN0LnZhcmllbnRJZCA9IHZhcmllbnQudmFyaWFudElkO1xyXG4gICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gdmFyaWVudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgcHJvZHVjdC5wcmljZSA9IHZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcclxuICAgIHByb2R1Y3QuaXRlbUludmVudG9yeSA9IHZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgIHByb2R1Y3QucXVhbnRpdHkgPSB0aGlzLmdldFZhcmllbnRRdWFudGl0eSh2YXJpZW50KTtcclxuICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0aGlzLmlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdCh2YXJpZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VmFyaWVudFF1YW50aXR5KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IG51bWJlciB7XHJcbiAgICBsZXQgaXRlbVF1YW50aXR5OiBudW1iZXIgPSAwO1xyXG4gICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKVxyXG4gICAgICAgIGl0ZW1RdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGl0ZW1RdWFudGl0eTtcclxuICB9XHJcbiAgcHJpdmF0ZSBpc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcclxuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJlc2VudDtcclxuICB9XHJcblxyXG5cclxuICAvLyBhcHBseUZpbHRlcihjYXRlZ29yeT86IGFueSwgdHlwZT86ICdTT1JUJyB8ICdGSUxURVInKSB7XHJcbiAgLy8gICB0aGlzLnBhZ2VObyA9IDE7XHJcbiAgLy8gICBpZiAodHlwZSA9PT0gXCJGSUxURVJcIikge1xyXG4gIC8vICAgICBjYXRlZ29yeS5zdGF0dXMgPSAhY2F0ZWdvcnkuc3RhdHVzO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgLy8gRm9yIFNPUlQsIHNvcnRCeSBpcyBhbHJlYWR5IHNldCBmcm9tIG5nTW9kZWxcclxuICAvLyAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWY/LmRpc21pc3MoKTtcclxuICAvLyAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkpO1xyXG4gIC8vIH1cclxuXHJcbiAgbmF2aWdhdGVGaWx0ZXIoc29ydGluZzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNvcnRCeSA9IHNvcnRpbmc7XHJcbiAgICBsZXQgc2VsZWN0ZWRDYXRlZ29yeSA9IFwiXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRDb2xsZWN0aW9uID0gXCJcIjtcclxuICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zdGF0dXMpLm1hcCgoY2F0ZWdvcnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5jYXRlZ29yeSxcclxuICAgICAgICBzbHVnOiBjYXRlZ29yeS5vcHRpb24ucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXHJcbiAgICAgIH1cclxuICAgIH0pLmZvckVhY2goKGNhdGVnb3J5KSA9PiBzZWxlY3RlZENhdGVnb3J5ICs9IChjYXRlZ29yeS5zbHVnICsgXCIrXCIpKTtcclxuICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnN0YXR1cykubWFwKChjb2xsZWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uY29sbGVjdGlvbixcclxuICAgICAgICBzbHVnOiBjb2xsZWN0aW9uLm9wdGlvbi5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgICAgfVxyXG4gICAgfSkuZm9yRWFjaCgoY29sbGVjdGlvbikgPT4gc2VsZWN0ZWRDb2xsZWN0aW9uICs9IChjb2xsZWN0aW9uLnNsdWcgKyBcIitcIikpO1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmPy5kaXNtaXNzKCk7XHJcbiAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgfVxyXG4gIGNsb3NlRmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJCb3R0b21TaGVldFJlZj8uZGlzbWlzcygpO1xyXG4gIH1cclxuICBvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb246IGFueSkge1xyXG4gICAgdGhpcy5maWx0ZXJCb3R0b21TaGVldFJlZiA9IHRoaXMubWF0Qm90dG9tU2hlZXQub3BlbihGaWx0ZXJTZWN0aW9uKTtcclxuICB9XHJcbiAgb3BlblNvcnRpbmcoU29ydGluZ1NlY3Rpb246IGFueSkge1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmID0gdGhpcy5tYXRCb3R0b21TaGVldC5vcGVuKFNvcnRpbmdTZWN0aW9uLCB7fSk7XHJcbiAgfVxyXG4gIHBhZ2luYXRpb25DaGFuZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VObyA9IHBhZ2U7XHJcbiAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5ID8/IFwiXCIpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgfVxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmPy5kaXNtaXNzKCk7XHJcbiAgfVxyXG4gIGlzSXRlbU91dE9mU3RvY2socHJvZHVjdDogUHJvZHVjdCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHByb2R1Y3QuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID09IDA7XHJcbiAgfVxyXG4gIGdldEl0ZW1WYXJpZW50KHByb2R1Y3Q6IFByb2R1Y3QsIHZhcmllbnRJZDogc3RyaW5nKTogSXRlbVZhcmlhbnQgfCBudWxsIHtcclxuICAgIGxldCBzZWxlY3RlZFZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcm9kdWN0Py5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpID0+IHtcclxuICAgICAgaWYgKHZhcmllbnQudmFyaWFudElkID09PSB2YXJpZW50SWQpXHJcbiAgICAgICAgc2VsZWN0ZWRWYXJpZW50ID0gdmFyaWVudDtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gc2VsZWN0ZWRWYXJpZW50O1xyXG4gIH1cclxuICBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPCA0NzU7XHJcbiAgfVxyXG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcclxuICB9XHJcbiAgZ2V0IG1pblNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdGFsQ291bnQsICgoKHRoaXMucGFnZU5vIC0gMSkgKiB0aGlzLnNpemUgKyAxKSArIHRoaXMuc2l6ZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdEltYWdlcyhwcm9kdWN0OiBhbnkpIHtcclxuICAgIGlmICghcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSkgcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSA9IDA7XHJcbiAgICBsZXQgaW1hZ2VJbmRleDogbnVtYmVyID0gcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSAlIHByb2R1Y3Q/LlsnaXRlbUltYWdlcyddPy5sZW5ndGg7XHJcbiAgICByZXR1cm4gcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/LltpbWFnZUluZGV4XT8uaW1nVXJsXHJcbiAgfVxyXG5cclxuICBhc3luYyBjaGFuZ2VJbWFnZShwcm9kdWN0OiBhbnksIGFjdGlvbjogJ1BSRVYnIHwgJ05FWFQnLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmltYWdlSW5kZXggPSBpbmRleDtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDApKTtcclxuICAgIGlmIChhY3Rpb24gPT09ICdORVhUJykge1xyXG4gICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddKys7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddLS07XHJcbiAgICAgIGlmIChwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddIDwgMClcclxuICAgICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddID0gcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/Lmxlbmd0aCAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLmltYWdlSW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LmlkID8/IFwiXCI7XHJcbiAgfVxyXG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LnN0eWxlcztcclxuICB9XHJcbiAgZ2V0RWxlbWVudFJvdygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0eWxlcz8uZWxlbWVudEluUm93ID8/IDVcclxuICB9XHJcblxyXG4gIHNob3dBbGxDYXRlZ29yaWVzID0gZmFsc2U7XHJcblxyXG4gIGdldCBkaXNwbGF5ZWRDYXRlZ29yaWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbENhdGVnb3JpZXMgPyB0aGlzLmNhdGVnb3JpZXMgOiB0aGlzLmNhdGVnb3JpZXMuc2xpY2UoMCwgNCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yaWVzKCkge1xyXG4gICAgdGhpcy5zaG93QWxsQ2F0ZWdvcmllcyA9ICF0aGlzLnNob3dBbGxDYXRlZ29yaWVzO1xyXG4gIH1cclxuXHJcbiAgc2hvd0FsbENvbGxlY3Rpb25zID0gZmFsc2U7XHJcblxyXG4gIGdldCBkaXNwbGF5ZWRDb2xsZWN0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dBbGxDb2xsZWN0aW9ucyA/IHRoaXMuY29sbGVjdGlvbnMgOiB0aGlzLmNvbGxlY3Rpb25zLnNsaWNlKDAsIDQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ29sbGVjdGlvbnMoKSB7XHJcbiAgICB0aGlzLnNob3dBbGxDb2xsZWN0aW9ucyA9ICF0aGlzLnNob3dBbGxDb2xsZWN0aW9ucztcclxuICB9XHJcblxyXG4gIHNob3dBbGxCcmFuZHMgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGRpc3BsYXllZEJyYW5kcygpIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dBbGxCcmFuZHMgPyB0aGlzLmJyYW5kcyA6IHRoaXMuYnJhbmRzLnNsaWNlKDAsIDQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQnJhbmRzKCkge1xyXG4gICAgdGhpcy5zaG93QWxsQnJhbmRzID0gIXRoaXMuc2hvd0FsbEJyYW5kcztcclxuICB9XHJcblxyXG4gIGNhdGVnb3JpZXNDb2xsYXBzZWQgPSBmYWxzZTtcclxuICBjb2xsZWN0aW9uc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIGJyYW5kc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHJhdGluZ3NDb2xsYXBzZWQgPSBmYWxzZTtcclxuICBwcmljZUNvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHByb2R1Y3RUeXBlQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgc2hvcEZvckNvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIG1hdGVyaWFsQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgbWV0YWxDb2xsYXBzZWQgPSBmYWxzZTtcclxuICByaW5nU3R5bGVDb2xsYXBzZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmVlZHMgdGhlIEhvbWUgVmlzaXQgYm9va2luZyBmbG93IGRpcmVjdGx5IChCb29raW5nR3JvdXAucHJvZHVjdExpbmVzKSByYXRoZXIgdGhhbiB0aGVcclxuICAgKiByZXRpcmluZyBUUklBTF9DQVJULiBKdXN0IGFkZHMgdG8gdGhlIGxvY2FsIEhvbWUgVmlzaXQgY2FydCBhbmQgY29uZmlybXMgd2l0aCBhIHRvYXN0IOKAlCBpdFxyXG4gICAqIGRvZXMgbm90IG9wZW4gdGhlIGJvb2tpbmcgd2l6YXJkLCBzbyBhIHNob3BwZXIgY2FuIGtlZXAgYnJvd3NpbmcgdGhlIGdyaWQgYW5kIGFkZCBtb3JlXHJcbiAgICogcGllY2VzLiBUaGV5IGNvbnRpbnVlIGludG8gdGhlIHdpemFyZCBsYXRlciBmcm9tIHRoZSBCb29raW5nIENhcnQgKGhlYWRlciBpY29uIC8gY2FydCBwYWdlKS5cclxuICAgKi9cclxuICBhc3luYyBhZGRUb1RyaWFsQ2FydChwcm9kdWN0OiBQcm9kdWN0KSB7XHJcbiAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudChwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UuYWRkSXRlbSgnSE9NRV9WSVNJVCcsIHByb2R1Y3QgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5ib29raW5nUHJvZHVjdENhcnRTZXJ2aWNlLmFkZEl0ZW0oJ0hPTUVfVklTSVQnLCBwcm9kdWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RyeSBhdCBob21lJywgZGV0YWlsOiAnQWRkZWQgdG8geW91ciBIb21lIFZpc2l0IGNhcnQnIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2FtZSBzaGFwZSBhcyBhZGRUb1RyaWFsQ2FydCgpIC0gYWRkcyB0aGUgcHJvZHVjdCBkaXJlY3RseSB0byB0aGUgbG9jYWwgVmlkZW8gQ2FsbCBjYXJ0IGFuZFxyXG4gICAqIGNvbmZpcm1zIHdpdGggYSB0b2FzdCwgbm8gZGlhbG9nLCBubyBuYW1lL21vYmlsZSBjb2xsZWN0aW9uIGhlcmUgKHRoYXQgaGFwcGVucyBsYXRlciwgaW5cclxuICAgKiBDb250YWN0IERldGFpbHMgb24gdGhlIGRlZGljYXRlZCBib29raW5nIHBhZ2UpLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFZpZGVvQ2FsbEN1cnJlbnQocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPyB0aGlzLmdldEl0ZW1WYXJpZW50KHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKSA6IG51bGw7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLmJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UuYWRkSXRlbSgnVklERU9fQ0FMTCcsIHByb2R1Y3QsIGl0ZW1WYXJpZW50Py52YXJpYW50SWQgPz8gdW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCcsIGRldGFpbDogJ0FkZGVkIHRvIHlvdXIgVmlkZW8gQ2FsbCByZXF1ZXN0JyB9KTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdDb3VsZCBub3QgYWRkIHRoaXMgcHJvZHVjdCB0byB5b3VyIHZpZGVvIGNhbGwg4oCUIHBsZWFzZSB0cnkgYWdhaW4nIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbCgpIHtcclxuICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlTW9kYWxDZW50ZXInKTtcclxuICAgIGlmIChtb2RhbEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9kYWxFbGVtZW50LCAnZGF0YS1icy1kaXNtaXNzJywgJ21vZGFsJyk7XHJcbiAgICAgIG1vZGFsRWxlbWVudC5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VGV4dENvbG9yKGNvbG9yOiBhbnkpIHtcclxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEzMDtcclxuICAgIGNvbnN0IHIgPSBwYXJzZUludChjb2xvci5zbGljZSgxLCAzKSwgMTYpO1xyXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDMsIDUpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoNSwgNyksIDE2KTtcclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiB0aHJlc2hvbGQgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XHJcbiAgfVxyXG59XHJcbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gQ2FsbCBTY2hlZHVsZVwiXHJcbiAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG48cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIlZpZGVvIFNjaGVkdWxpbmdcIlxyXG4gIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuXHJcbjwhLS0gPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCIgKm5nSWY9XCJpc01vYmlsZVwiIFtuZ0NsYXNzXT1cInsnaW5wdXQtZ3JvdXAtc3RpY2t5Jzogc2Nyb2xsaW5nVmFsdWUgPiAyMH1cIj5cclxuICA8bWF0LWljb24gY2xhc3M9XCJmLTIwIGQtZmxleCBhbGlnbi1pdGVtLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+c2VhcmNoPC9tYXQtaWNvbj5cclxuICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFByb2R1Y3QuLlwiIGFyaWEtbGFiZWw9XCJTZWFyY2ggUHJvZHVjdFwiXHJcbiAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hQcm9kdWN0KClcIj5cclxuPC9kaXY+IC0tPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICA8c2VjdGlvbiBbaWRdPVwiZGF0YT8uaWRcIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCB0b3RhbC1jb250YWluZXJcIiBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBzaW1wb0hvdmVyXHJcbiAgICAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiXHJcbiAgICBbc3R5bGUucGFkZGluZ1RvcC5weF09XCJpc01vYmlsZSA/ICcwICFpbXBvcnRhbnQnIDogJydcIiBbYXR0ci5zdHlsZV09XCJjdXN0b21DbGFzc1wiXHJcbiAgICBbc3BhY2luZ0hvcml6b250YWxdPVwic3R5bGVzTGF5b3V0XCI+XHJcblxyXG4gICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cclxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCJcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzUwJScsICdoZWlnaHQnOiAnMzBweCd9XCI+PC9wLXNwZWVkRGlhbD5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMCBvbmx5RGVza3RvcFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXRvcC1zZWN0aW9uIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1iYXNlbGluZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXIgYm9keS1sYXJnZVwiPlxyXG4gICAgICAgICAgRmlsdGVyc1xyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhclwiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICAgIENMRUFSIEFMTFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBpdGVtaWQ9XCJ0b3Atc2VjdGlvblwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogNzcuNSU7IG1hcmdpbi1yaWdodDogMSU7XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMTVcIiBzdHlsZT1cIndpZHRoOiA3NSU7IGRpc3BsYXk6ZmxleDsgZmxleC13cmFwOndyYXBcIj48L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDEwcHg7XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtNiBmdy1ub3JtYWwgbXItM1wiPlNvcnQgYnk8L2Rpdj5cclxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzb3J0QnlcIiAoY2hhbmdlKT1cImFwcGx5RmlsdGVyKCRldmVudCwgJ1NPUlQnKVwiIHN0eWxlPVwiY29sb3I6IGJsYWNrO1wiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJmaWx0ZXIudmFsdWVcIiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGZpbHRlcmluZ0FycmF5XCI+e3sgZmlsdGVyLm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXNvcnQtZHJvcGRvd25cIiB0YWJpbmRleD1cIjBcIiAoYmx1cik9XCJjbG9zZURyb3Bkb3duKClcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0LWxhYmVsXCI+U29ydCBCeTo8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLXZhbHVlXCI+e3sgZ2V0U2VsZWN0ZWROYW1lKCkgfHwgJ0ZlYXR1cmVkJyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWljb25cIiBbY2xhc3Mub3Blbl09XCJpc09wZW5cIj4mIzk2NjI7PC9zcGFuPiA8IS0tIERvd24gYXJyb3csIHJvdGF0ZXMgb3BlbiAtLT5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiICpuZ0lmPVwiaXNPcGVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJpbmdBcnJheVwiIGNsYXNzPVwib3B0aW9uXCIgW2NsYXNzLnNlbGVjdGVkXT1cImZpbHRlci52YWx1ZSA9PT0gc29ydEJ5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKGZpbHRlciwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIHt7IGZpbHRlci5uYW1lIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYWluLXByb2R1Y3Qtc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXNpZGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmlsdGVyU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9BbmltYXRpb25dPVwic3R5bGVzPy5hbmltYXRpb25cIiBjbGFzcz1cInJpZ2h0LXNpZGVcIiAoc2Nyb2xsKT1cImhhbmRsZVByb2R1Y3RMaXN0U2Nyb2xsKClcIlxyXG4gICAgICAgICNsaXN0U2Nyb2xsQ29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYXBpTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcGFyZW50XCIgKm5nSWY9XCJyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiByZXNwb25zZURhdGE7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cInByb2R1Y3RcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJhcHBseVByb2R1Y3RXaWR0aCgpID8gZ2V0UHJvZHVjdFdpZHRoKCkgOiAnJ1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7IHBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy50aGVtZSA9PSB0aGVtZS5UaGVtZTFcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzYzsgY29udGV4dDoge2RhdGE6IHByb2R1Y3QsIGluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZXM/LnRoZW1lICE9IHRoZW1lLlRoZW1lMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNpbXBvLXNtYWxsLXByb2R1Y3QtbGlzdGluZyBbcHJvZHVjdF09XCJwcm9kdWN0XCIgW2RhdGFdPVwiZGF0YVwiIFtpc1Njcm9sbGFibGVdPVwic2NyZWVuV2lkdGggPiA0NzVcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaVwiPjwvc2ltcG8tc21hbGwtcHJvZHVjdC1saXN0aW5nPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMaXN0TG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJlbXB0eS1jYXJ0XCIgKm5nSWY9XCIhaXNMaXN0TG9hZGluZyAmJiByZXNwb25zZURhdGE/Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzdHlsZT1cImhlaWdodDogMTUwcHg7IHdpZHRoOiAxNTBweDtcIlxyXG4gICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzEwNzIxM2MxNzE2NTQzMzM0MDQwZW1wdHktY2FydC5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZy1tZWRpdW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgUHJvZHVjdCBsaXN0IGlzIGVtcHR5XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIExvb2tzIGxpa2Ugbm8gaXRlbSBpcyBwcmVzZW50IHdpdGggZmlsdGVyLiBHbyBhaGVhZCAmIGV4cGxvcmUgdG9wIGNhdGVnb3JpZXMuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiYXBpTG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tZmlsdGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmaWx0ZXItdGV4dFwiIHN0eWxlPVwiZ2FwOiAxMHB4XCIgKGNsaWNrKT1cIm9wZW5Tb3J0aW5nKFNvcnRpbmdTZWN0aW9uKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPnNvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+U29ydCBieTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmlsdGVyLXRleHRcIiBzdHlsZT1cImdhcDogMTBweFwiIChjbGljayk9XCJvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb24pXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+RmlsdGVyPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cclxuICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiXHJcbiAgICAgICAgW2lzRWNvbW1lcmNlXT1cInRydWVcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxyXG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCJcclxuICBbdGhlbWVdPVwieyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICc0MHZoJywgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsICdyaWdodCc6ICc1cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI0Zhdm91cml0ZVRhZ3MgbGV0LXByb2R1Y3Q9XCJkYXRhXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZhdi1pY29uLXdyYXBwZXJcIj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCIgKm5nSWY9XCIhcHJvZHVjdC53aGlzbGlzdFwiPmZhdm9yaXRlX2JvcmRlclxyXG4gICAgPC9tYXQtaWNvbj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ1JFTU9WRScpXCIgKm5nSWY9XCJwcm9kdWN0LndoaXNsaXN0XCI+ZmF2b3JpdGVcclxuICAgIDwvbWF0LWljb24+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZhdi10b29sdGlwXCI+XHJcbiAgICAgIHt7IHByb2R1Y3Qud2hpc2xpc3QgPyAnUmVtb3ZlIGZyb20gd2lzaGxpc3QnIDogJ0FkZCB0byB3aXNobGlzdCcgfX1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNUYWdzIGxldC1wcm9kdWN0PVwiZGF0YVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXRhZy1iYWRnZVwiICpuZ0lmPVwicHJvZHVjdD8udGFncz8ubGVuZ3RoXCI+XHJcbiAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdGFnIG9mIHByb2R1Y3QudGFnczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwicHJvZHVjdC10YWctbGFiZWxcIlxyXG4gICAgICBbY2xhc3MudGFnLWFjdGl2ZV09XCJpID09PSAodGFnSW5kZXhNYXBbcHJvZHVjdC5pdGVtSWRdID8/IDApXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRUZXh0Q29sb3Ioc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcilcIj5cclxuICAgICAge3sgdGFnIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNGaWx0ZXJTZWN0aW9uPlxyXG4gIDxzZWN0aW9uPlxyXG4gICAgPCEtLSBTZXJ2ZXItZHJpdmVuIGZpbHRlcnMgZnJvbSBxdWVyeS1vcHRpb25zIChCcmFuZCwgQ2F0ZWdvcmllcywgQ29sbGVjdGlvbnMsIFNwZWNpZmljYXRpb25zLCAuLi4pLlxyXG4gICAgICAgICBFbXB0eSBmb3IgdW5zZWVkZWQgYnVzaW5lc3NlcywgaW4gd2hpY2ggY2FzZSB0aGUgbGVnYWN5IGJsb2NrcyBiZWxvdyBhcmUgdGhlIHNpZGViYXIuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBjdXN0b21GaWx0ZXJHcm91cHNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwiY3VzdG9tR3JvdXBDb2xsYXBzZWRbZ3JvdXAua2V5XSA9ICFjdXN0b21Hcm91cENvbGxhcHNlZFtncm91cC5rZXldXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj57eyBncm91cC5sYWJlbCB9fTwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBjdXN0b21Hcm91cENvbGxhcHNlZFtncm91cC5rZXldID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21Hcm91cENvbGxhcHNlZFtncm91cC5rZXldXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGdyb3VwLmZpbHRlcnNcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJncm91cC5maWx0ZXJzLmxlbmd0aCA+IDFcIiBjbGFzcz1cInRyaW0tdGV4dFwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLXRvcDogOHB4O1wiPlxyXG4gICAgICAgICAgICB7eyBmaWx0ZXIubGFiZWwgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuY29udHJvbCA9PT0gJ1JBTkdFJzsgZWxzZSBjdXN0b21DaG9pY2VzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDhweDsgbWFyZ2luLXRvcDogNnB4O1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMDtcIiBbYXR0ci5taW5dPVwiZmlsdGVyLm1pblwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5tYXhdPVwiZmlsdGVyLm1heFwiIFtwbGFjZWhvbGRlcl09XCInTWluICcgKyAoZmlsdGVyLm1pbiA/PyAnJylcIlxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VzdG9tUmFuZ2UoZmlsdGVyLmlkZW50aWZpZXIpLm1pblwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEN1c3RvbVJhbmdlKGZpbHRlci5pZGVudGlmaWVyLCAnbWluJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuPi08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAwO1wiIFthdHRyLm1pbl09XCJmaWx0ZXIubWluXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLm1heF09XCJmaWx0ZXIubWF4XCIgW3BsYWNlaG9sZGVyXT1cIidNYXggJyArIChmaWx0ZXIubWF4ID8/ICcnKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXN0b21SYW5nZShmaWx0ZXIuaWRlbnRpZmllcikubWF4XCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0Q3VzdG9tUmFuZ2UoZmlsdGVyLmlkZW50aWZpZXIsICdtYXgnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21DaG9pY2VzPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLmNvbnRyb2wgPT09ICdCT09MRUFOJyAmJiAhZmlsdGVyLmNob2ljZXM/Lmxlbmd0aDsgZWxzZSBjaG9pY2VMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDdXN0b21DaG9pY2VTZWxlY3RlZChmaWx0ZXIuaWRlbnRpZmllciwgJ3RydWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ3VzdG9tQ2hvaWNlKGZpbHRlciwgJ3RydWUnKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+WWVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hvaWNlTGlzdD5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBmaWx0ZXIuY2hvaWNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDdXN0b21DaG9pY2VTZWxlY3RlZChmaWx0ZXIuaWRlbnRpZmllciwgY2hvaWNlLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ3VzdG9tQ2hvaWNlKGZpbHRlciwgY2hvaWNlLnZhbHVlKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgY2hvaWNlLmxhYmVsIH19IDxzcGFuICpuZ0lmPVwiY2hvaWNlLmNvdW50ICE9PSB1bmRlZmluZWRcIj4oe3sgY2hvaWNlLmNvdW50IH19KTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE5vIGxlZ2FjeSBDYXRlZ29yaWVzIGJsb2NrOiBjYXRlZ29yaWVzIGFyZSBzaG93biBvbmx5IHdoZW4gcXVlcnktb3B0aW9ucyByZXR1cm5zIHRoZW0uIC0tPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cInRvU2hvd0luSmV3ZWxsZXJ5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInByb2R1Y3RUeXBlQ29sbGFwc2VkID0gIXByb2R1Y3RUeXBlQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5Qcm9kdWN0IFR5cGU8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgcHJvZHVjdFR5cGVDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXByb2R1Y3RUeXBlQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBwcm9kdWN0VHlwZXNEYXRhXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlUHJvZHVjdFNpemUoc2l6ZSlcIiAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7IHNpemUuc2l6ZSB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cInRvU2hvd0luSmV3ZWxsZXJ5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNob3BGb3JDb2xsYXBzZWQgPSAhc2hvcEZvckNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+U2hvcCBmb3I8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgc2hvcEZvckNvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvcEZvckNvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2Ygc2hvcEZvckRhdGFcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNpemUuc3RhdHVzXCIgKGNoYW5nZSk9XCJ0b2dnbGVTaG9wU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwibWF0ZXJpYWxDb2xsYXBzZWQgPSAhbWF0ZXJpYWxDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPk1hdGVyaWFsPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IG1hdGVyaWFsQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtYXRlcmlhbENvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgbWF0ZXJpYWxTaXplRGF0YVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2l6ZS5zdGF0dXNcIiAoY2hhbmdlKT1cInRvZ2dsZU1hdGVyaWFsU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwibWV0YWxDb2xsYXBzZWQgPSAhbWV0YWxDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPk1ldGFsPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IG1ldGFsQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXRhbENvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgbWV0YWxTaXplRGF0YVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2l6ZS5zdGF0dXNcIiAoY2hhbmdlKT1cInRvZ2dsZU1ldGFsU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwicmluZ1N0eWxlQ29sbGFwc2VkID0gIXJpbmdTdHlsZUNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+UmluZyBTdHlsZTwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyByaW5nU3R5bGVDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJpbmdTdHlsZUNvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgcmluZ1NpemVzXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSYXRpbmdzIGFuZCBwcmljZSBzdGF5IGF0IHRoZSBib3R0b20sIGJlbG93IHRoZSBzZXJ2ZXItZHJpdmVuIGZpbHRlcnMuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJyYXRpbmdzQ29sbGFwc2VkID0gIXJhdGluZ3NDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPlJhdGluZ3M8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgcmF0aW5nc0NvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmF0aW5nc0NvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiByYXRpbmdPcHRpb25zXCIgKGNsaWNrKT1cIm9uUmF0aW5nQ2hhbmdlKHJhdGluZylcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInJhdGluZy5zZWxlY3RlZFwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgcmF0aW5nLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJwcmljZUNvbGxhcHNlZCA9ICFwcmljZUNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+U2hvcCBieSBwcmljZTwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBwcmljZUNvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcHJpY2VDb2xsYXBzZWRcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHJhbmdlIG9mIHByaWNlUmFuZ2VzO2xldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmFuZ2Uuc2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uUHJpY2VSYW5nZUNoYW5nZShpKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgcmFuZ2UubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU29ydGluZ1NlY3Rpb24+XHJcbiAgPHNlY3Rpb24gc3R5bGU9XCJwYWRkaW5nOiAxMHB4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtLWNlbnRlciBcIiBzdHlsZT1cInBhZGRpbmc6IDBweDtcIj5cclxuICAgICAgPHNwYW4+U29ydCBieTwvc3Bhbj5cclxuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJjbG9zZURpYWxvZygpXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bWF0LXJhZGlvLWdyb3VwIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgWyhuZ01vZGVsKV09XCJzb3J0QnlcIj5cclxuICAgICAgPG1hdC1yYWRpby1idXR0b24gKm5nRm9yPVwibGV0IHNvcnRpbmdUeXBlIG9mIGZpbHRlcmluZ0FycmF5XCIgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihzb3J0aW5nVHlwZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgW3ZhbHVlXT1cInNvcnRpbmdUeXBlLnZhbHVlXCI+e3tzb3J0aW5nVHlwZS5uYW1lfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI1Byb2R1Y3REZXNjIGxldC1wcm9kdWN0PVwiZGF0YVwiIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgPG5nLXRlbXBsYXRlICN0aGVtZTFzdHlsZTE+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkIHBvc2l0aW9uLXJlbGF0aXZlIGgtMTAwXCIgW25nQ2xhc3NdPVwieydob3Zlci1lZmZlY3QnOiBzdHlsZXM/LnRoZW1lID09IHRoZW1lLlRoZW1lMX1cIj5cclxuICAgICAgPGRpdiAqbmdJZj1cIiEocHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggJiYgcHJvZHVjdC5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybClcIlxyXG4gICAgICAgIGNsYXNzPVwiZGVmYXVsdC1pbWFnZSBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCIgYWx0PVwiXCJcclxuICAgICAgICAgIChjbGljayk9XCJwcm9jZWVkVG9Qcm9kdWN0RGVzYyhwcm9kdWN0KVwiIFtzaW1wb0JhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkZhdm91cml0ZVRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJUYWdzOyBjb250ZXh0OiB7ZGF0YTogcHJvZHVjdH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggJiYgcHJvZHVjdC5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybFwiXHJcbiAgICAgICAgY2xhc3M9XCJkZWZhdWx0LWltYWdlIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxyXG4gICAgICAgICAgW3NyY109XCJnZXRQcm9kdWN0SW1hZ2VzKHByb2R1Y3QpXCIgYWx0PVwiXCIgY2xhc3M9XCJwcm9kdWN0LWltZ1wiIFtjbGFzcy5mYWRlLW91dF09XCJpbWFnZUluZGV4ID09IGluZGV4XCJcclxuICAgICAgICAgIChjbGljayk9XCJwcm9jZWVkVG9Qcm9kdWN0RGVzYyhwcm9kdWN0KVwiIFtzaW1wb0JhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcm91c2VsLWJ1dHRvbnNcIiAqbmdJZj1cInByb2R1Y3QuaXRlbUltYWdlcz8ubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgPGRpdj48bWF0LWljb24gKGNsaWNrKT1cImNoYW5nZUltYWdlKHByb2R1Y3QsICdQUkVWJywgaW5kZXgpXCI+a2V5Ym9hcmRfYXJyb3dfbGVmdDwvbWF0LWljb24+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2PjxtYXQtaWNvbiAoY2xpY2spPVwiY2hhbmdlSW1hZ2UocHJvZHVjdCwgJ05FWFQnLCBpbmRleClcIj5rZXlib2FyZF9hcnJvd19yaWdodDwvbWF0LWljb24+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkZhdm91cml0ZVRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJUYWdzOyBjb250ZXh0OiB7ZGF0YTogcHJvZHVjdH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMiB3LTEwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWxpc3RcIiAqbmdJZj1cInByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGhcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgcHJvZHVjdD8uaXRlbVZhcmlhbnQ7IGxldCBpZHggPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiXHJcbiAgICAgICAgICAgICAgW3NyY109XCJ2YXJpZW50LnZhcmlhbnRJbWFnZXM/LlswXT8uaW1nVXJsXCIgYWx0PVwiXCIgY2xhc3M9XCJ2YXJpZW50XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLXZhcmllbnQnOiB2YXJpZW50LnZhcmlhbnRJZCA9PSBwcm9kdWN0LnZhcmllbnRJZH1cIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJ2YXJpZW50LnZhcmlhbnRJZCA9PSBwcm9kdWN0LnZhcmllbnRJZCA/ICdibHVlJyA6ICd0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWYXJpZW50KHByb2R1Y3QsIHZhcmllbnQpXCI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW0tY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgW3N0eWxlLmRpc3BsYXldPVwidHJ1ZSA/ICdibG9jayFpbXBvcnRhbnQnIDogJydcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZSBib2R5LWxhcmdlIHRleHQtbGVmdCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGctMTBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE2XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAgICAgICAge3twcm9kdWN0Py5wcmljZT8uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjAtMCd9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNiB0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0Py5wcmljZT8udmFsdWUgLSBwcm9kdWN0Py5wcmljZT8uZGlzY291bnRlZFByaWNlID4gMlwiIGNsYXNzPVwiZGlzY291bnQtcHJpY2VcIj5cclxuICAgICAgICAgICAgICAgIHt7cHJvZHVjdD8ucHJpY2U/LnZhbHVlIHwgbnVtYmVyOicxLjAtMCd9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInByaWNlIGRpc2NvdW50LXByaWNlXCIgKm5nSWY9XCJwcm9kdWN0Py5wcmljZT8uZGlzY291bnRlZFByaWNlIDwgcHJvZHVjdD8ucHJpY2U/LnNlbGxpbmdQcmljZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIHt7cHJvZHVjdC5wcmljZS5zZWxsaW5nUHJpY2UgfCBudW1iZXI6JzEuMC0wJ319XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LW5hbWUgaGVhZGluZy1sYXJnZSB3LTEwMCB0ZXh0LWxlZnQgdHJpbS10ZXh0XCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57eyBwcm9kdWN0Lm5hbWUgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0ZXJpYWwtaW5mb1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNYXRlcmlhbEJhc2VkUHJpY2luZyAmJiAocHJvZHVjdD8ubWF0ZXJpYWxzPy5sZW5ndGggfHwgcHJvZHVjdD8uYmFzZVdlaWdodClcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0Py5tYXRlcmlhbHM/LlswXT8ucHVyaXR5XCI+e3sgcHJvZHVjdC5tYXRlcmlhbHNbMF0ucHVyaXR5IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3Q/Lm1hdGVyaWFscz8uWzBdPy5wdXJpdHkgJiYgcHJvZHVjdD8uYmFzZVdlaWdodFwiPiDCtyA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8uYmFzZVdlaWdodFwiPnt7IHByb2R1Y3QuYmFzZVdlaWdodCB9fWc8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvbiAmJiAhYXBwb2ludG1lbnRTZXR0aW5ncz8uaG9tZVZpc2l0UHJvZHVjdHNFbmFibGVkICYmIHByb2R1Y3QuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLXRvLWNhcnQtYnRuXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCJcclxuICAgICAgICAgICAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIoIXByb2R1Y3QucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2socHJvZHVjdCkpICYmIElzRWNvbW1lcmNlXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkSXRlbVRvQ2FydCgkZXZlbnQsIHByb2R1Y3QsICdBREQnKVwiPkFkZCB0byBDYXJ0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhSXNFY29tbWVyY2VcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCIgKGNsaWNrKT1cInJhaXNlTGVhZCgpXCI+Tm90aWZ5IE1lPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eSBmdWxsLXdpZHRoLXF1YW50aXR5XCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwidHJ1ZSA/ICcxMDAlJyA6ICcnXCIgKm5nSWY9XCJwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGFuZ2UtcXVhbnRpdHlcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCdXR0b25TdHlsZSgxKT8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkSXRlbVRvQ2FydCgkZXZlbnQsIHByb2R1Y3QsICdTVUJTVFJBQ1QnKVwiPi08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogNzAlO1wiPnt7cHJvZHVjdC5xdWFudGl0eX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhbmdlLXF1YW50aXR5XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy50ZXh0Q29sb3JcIiAoY2xpY2spPVwiYWRkSXRlbVRvQ2FydCgkZXZlbnQsIHByb2R1Y3QsICdBREQnKVwiPis8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVwib3V0LW9mLXN0b2NrXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCI+T3V0IE9mIFN0b2NrPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktYnV0dG9uLXNlY3Rpb25cIlxyXG4gICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LmRpc3BsYXk/LnNob3dCdXR0b24gJiYgYXBwb2ludG1lbnRTZXR0aW5ncz8uaG9tZVZpc2l0UHJvZHVjdHNFbmFibGVkICYmIHByb2R1Y3Q/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1hdC1ob21lXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHAtMlwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRvVHJpYWxDYXJ0KHByb2R1Y3QpXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIj5UUlkgQVRcclxuICAgICAgICAgICAgICAgIEhPTUU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1jYWxsLWltYWdlXCI+XHJcbiAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzU3ODYwNmMxNzUzNDUwODEwMjYydmlkZW9fQ2FsbC5zdmdcIlxyXG4gICAgICAgICAgICAgICAgYWx0PVwidmlkZW9cIiAoY2xpY2spPVwiYWRkVmlkZW9DYWxsQ3VycmVudChwcm9kdWN0KVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjcmVlbldpZHRoIDwgNDc1ICYmIHN0eWxlcz8ubW9iaWxlQ29sdW1uID09PSAxOyBlbHNlIHRoZW1lMXN0eWxlMVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGVmdFwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+e3sgcHJvZHVjdC5uYW1lIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE2IHRleHQtc3RhcnRcIj5cclxuICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxyXG4gICAgICAgICAge3twcm9kdWN0Py5wcmljZT8uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjAtMCd9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy00NVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LmRpc3BsYXk/LnNob3dCdXR0b24gJiYgIWFwcG9pbnRtZW50U2V0dGluZ3M/LmhvbWVWaXNpdFByb2R1Y3RzRW5hYmxlZCAmJiBwcm9kdWN0Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA+IDBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFkZC10by1jYXJ0LWJ0biB3LTEwMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiXHJcbiAgICAgICAgICAgICAgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKCFwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpKSAmJiBJc0Vjb21tZXJjZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj5BZGQgdG8gQ2FydDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIUlzRWNvbW1lcmNlXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiIChjbGljayk9XCJyYWlzZUxlYWQoKVwiPk5vdGlmeSBNZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHkgZnVsbC13aWR0aC1xdWFudGl0eSBici04XCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwidHJ1ZSA/ICcxMDAlJyA6ICcnXCIgKm5nSWY9XCJwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGFuZ2UtcXVhbnRpdHkgdy0zNSBici04XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy50ZXh0Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnU1VCU1RSQUNUJylcIj4tPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwid2lkdGg6IDcwJTtcIj57e3Byb2R1Y3QucXVhbnRpdHl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYW5nZS1xdWFudGl0eSB3LTM1IGJyLThcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCdXR0b25TdHlsZSgxKT8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiIChjbGljayk9XCJhZGRJdGVtVG9DYXJ0KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCI+Kzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJvdXQtb2Ytc3RvY2sgdy0xMDBcIiAqbmdJZj1cImlzSXRlbU91dE9mU3RvY2socHJvZHVjdClcIj5PdXQgT2YgU3RvY2s8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1idXR0b24tc2VjdGlvbiB3LTEwMFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvbiAmJiBhcHBvaW50bWVudFNldHRpbmdzPy5ob21lVmlzaXRQcm9kdWN0c0VuYWJsZWQgJiYgcHJvZHVjdD8uaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWF0LWhvbWVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gcC0yXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVG9UcmlhbENhcnQocHJvZHVjdClcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiPlRSWSBBVFxyXG4gICAgICAgICAgICAgICAgSE9NRTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWNhbGwtaW1hZ2VcIj5cclxuICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNTc4NjA2YzE3NTM0NTA4MTAyNjJ2aWRlb19DYWxsLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICBhbHQ9XCJ2aWRlb1wiIChjbGljayk9XCJhZGRWaWRlb0NhbGxDdXJyZW50KHByb2R1Y3QpXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBoLTEwMCBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcclxuICAgICAgICAgIFtzcmNdPVwiZ2V0UHJvZHVjdEltYWdlcyhwcm9kdWN0KVwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTExMFwiIFtjbGFzcy5mYWRlLW91dF09XCJpbWFnZUluZGV4ID09IGluZGV4XCJcclxuICAgICAgICAgIChjbGljayk9XCJwcm9jZWVkVG9Qcm9kdWN0RGVzYyhwcm9kdWN0KVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuXHJcbiJdfQ==
|