simpo-component-library 3.5.43 → 3.5.46
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/README.md +24 -24
- package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +5 -5
- package/esm2022/lib/components/document/document.component.mjs +5 -5
- package/esm2022/lib/components/hover-elements/hover-elements.component.mjs +4 -4
- package/esm2022/lib/components/image-loading/image-loading.component.mjs +5 -5
- package/esm2022/lib/components/index.mjs +5 -5
- package/esm2022/lib/components/input-fields/input-fields.component.mjs +4 -4
- package/esm2022/lib/components/payment-details/payment-details.component.mjs +5 -5
- package/esm2022/lib/constants/business.constant.mjs +1 -1
- package/esm2022/lib/directive/animation-directive.mjs +4 -4
- package/esm2022/lib/directive/background-directive.mjs +4 -4
- package/esm2022/lib/directive/banner-content-fit-directive.mjs +4 -4
- package/esm2022/lib/directive/blur-content.directive.mjs +4 -4
- package/esm2022/lib/directive/border-directive.mjs +4 -4
- package/esm2022/lib/directive/borderlessImage.directive.mjs +4 -4
- package/esm2022/lib/directive/button-directive.directive.mjs +4 -4
- package/esm2022/lib/directive/button-editor.directive.mjs +4 -4
- package/esm2022/lib/directive/color.directive.mjs +4 -4
- package/esm2022/lib/directive/column-directive.directive.mjs +4 -4
- package/esm2022/lib/directive/container-alignment.directive.mjs +4 -4
- package/esm2022/lib/directive/container-fir.directive.mjs +4 -4
- package/esm2022/lib/directive/content-alignment-directive.mjs +4 -4
- package/esm2022/lib/directive/content-fit-directive.mjs +4 -4
- package/esm2022/lib/directive/content-title-spacing.directive.mjs +4 -4
- package/esm2022/lib/directive/contenteditable.directive.mjs +4 -4
- package/esm2022/lib/directive/corner-directive.mjs +4 -4
- package/esm2022/lib/directive/footer-layout-directive.mjs +4 -4
- package/esm2022/lib/directive/hover-animation.directive.mjs +133 -0
- package/esm2022/lib/directive/hover-element-directive.mjs +4 -4
- package/esm2022/lib/directive/hoverborder.directive.mjs +4 -4
- package/esm2022/lib/directive/image-container.directive.mjs +4 -4
- package/esm2022/lib/directive/image-directive.directive.mjs +4 -4
- package/esm2022/lib/directive/image-editor.directive.mjs +4 -4
- package/esm2022/lib/directive/image-position.directive.mjs +4 -4
- package/esm2022/lib/directive/overlay-directive.mjs +4 -4
- package/esm2022/lib/directive/position-layout-directive.directive.mjs +4 -4
- package/esm2022/lib/directive/removeCarousel-directive.mjs +4 -4
- package/esm2022/lib/directive/spacing-around.directive.mjs +4 -4
- package/esm2022/lib/directive/spacing-horizontal.directive.mjs +4 -4
- package/esm2022/lib/directive/sticky-directive.mjs +4 -4
- package/esm2022/lib/directive/text-background-directive.directive.mjs +4 -4
- package/esm2022/lib/directive/text-size.directive.mjs +4 -4
- package/esm2022/lib/directive/wrap-containers.directive.mjs +4 -4
- package/esm2022/lib/ecommerce/sections/address/address.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +11 -10
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +6 -6
- package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +5 -5
- package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
- package/esm2022/lib/elements/add-section/add-section.component.mjs +5 -5
- package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +5 -5
- package/esm2022/lib/elements/button/button.component.mjs +5 -5
- package/esm2022/lib/elements/button/button.model.mjs +1 -1
- package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +5 -5
- package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +5 -5
- package/esm2022/lib/elements/editor-service.service.mjs +4 -4
- package/esm2022/lib/elements/heading-element/heading-element.component.mjs +5 -5
- package/esm2022/lib/elements/image-editor/image-editor.component.mjs +5 -5
- package/esm2022/lib/elements/index.mjs +5 -5
- package/esm2022/lib/elements/link-editor/link-editor.component.mjs +5 -5
- package/esm2022/lib/elements/media-selector/media-selector.component.mjs +5 -5
- package/esm2022/lib/elements/navbar-button-element/navbar-button-element.component.mjs +4 -4
- package/esm2022/lib/elements/portfolio/portfolio.component.mjs +5 -5
- package/esm2022/lib/elements/property/property.component.mjs +5 -5
- package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +5 -5
- package/esm2022/lib/elements/socia-icons/socia-icons.component.mjs +4 -4
- package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +5 -5
- package/esm2022/lib/elements/text/text.component.mjs +5 -5
- package/esm2022/lib/elements/text-editor/text-editor.component.mjs +5 -5
- package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +9 -5
- package/esm2022/lib/pipes/amount.pipe.mjs +4 -4
- package/esm2022/lib/pipes/gender.pipe.mjs +4 -4
- package/esm2022/lib/sections/BaseSection.mjs +1 -1
- package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +5 -5
- package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +5 -5
- package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
- package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +5 -5
- package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +5 -5
- package/esm2022/lib/sections/banner-section/banner-section.component.mjs +4 -4
- package/esm2022/lib/sections/blog-list/blog-list.component.mjs +6 -6
- package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
- package/esm2022/lib/sections/carousel-banner/carousel-banner.component.mjs +4 -4
- package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +5 -5
- package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
- package/esm2022/lib/sections/contact-us/contact-us.component.mjs +4 -4
- package/esm2022/lib/sections/faq-section/faq-section.component.mjs +5 -5
- package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
- package/esm2022/lib/sections/features-section/features-section.component.mjs +5 -5
- package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
- package/esm2022/lib/sections/footer/footer.component.mjs +5 -5
- package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
- package/esm2022/lib/sections/footer-section/footer-section.component.mjs +4 -4
- package/esm2022/lib/sections/header-section/header-section.component.mjs +9 -6
- package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
- package/esm2022/lib/sections/header-text/header-text.component.mjs +5 -5
- package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
- package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +5 -5
- package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +5 -5
- package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/image-section/image-section.component.mjs +5 -5
- package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
- package/esm2022/lib/sections/location-section/location-section.component.mjs +5 -5
- package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
- package/esm2022/lib/sections/logo-gallery/logo-gallery.component.mjs +4 -4
- package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +5 -5
- package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
- package/esm2022/lib/sections/moving-text/moving-text.component.mjs +110 -0
- package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +2 -0
- package/esm2022/lib/sections/navbar-section/navbar-section.component.mjs +4 -4
- package/esm2022/lib/sections/new-services/new-services.component.mjs +5 -5
- package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
- package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +5 -5
- package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
- package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +5 -5
- package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
- package/esm2022/lib/sections/process-modern/process-modern.component.mjs +5 -5
- package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
- package/esm2022/lib/sections/process-section/process-section.component.mjs +5 -5
- package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
- package/esm2022/lib/sections/property-component/property-component.component.mjs +5 -5
- package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-list/property-list.component.mjs +5 -5
- package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +5 -5
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
- package/esm2022/lib/sections/registration-form/registration-form.component.mjs +6 -6
- package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
- package/esm2022/lib/sections/service-section/service-section.component.mjs +5 -5
- package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
- package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +5 -5
- package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +5 -5
- package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +5 -5
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +5 -5
- package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +5 -5
- package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
- package/esm2022/lib/sections/text-image-section/text-image-section.component.mjs +4 -4
- package/esm2022/lib/sections/text-section/text-section.component.mjs +4 -4
- package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
- package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +5 -5
- package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-section/video-section.component.mjs +5 -5
- package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
- package/esm2022/lib/sections/view-blog/view-blog.component.mjs +5 -5
- package/esm2022/lib/services/cart.service.mjs +4 -4
- package/esm2022/lib/services/endUser.service.mjs +4 -4
- package/esm2022/lib/services/events.service.mjs +5 -4
- package/esm2022/lib/services/image-upload-service.service.mjs +4 -4
- package/esm2022/lib/services/rest.service.mjs +4 -4
- package/esm2022/lib/services/sanitizeHtml.mjs +4 -4
- package/esm2022/lib/services/storage.service.mjs +4 -4
- package/esm2022/lib/styles/index.mjs +7 -1
- package/esm2022/lib/styles/style.model.mjs +1 -1
- package/esm2022/lib/styles/types.mjs +1 -1
- package/esm2022/lib/tokens/api-token.mjs +1 -1
- package/esm2022/public-api.mjs +3 -2
- package/fesm2022/simpo-component-library.mjs +718 -479
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/directive/hover-animation.directive.d.ts +19 -0
- package/lib/elements/top-of-image-card/top-of-image-card.component.d.ts +3 -0
- package/lib/sections/header-section/header-section.component.d.ts +2 -0
- package/lib/sections/header-section/header-section.model.d.ts +10 -2
- package/lib/sections/moving-text/moving-text.component.d.ts +26 -0
- package/lib/sections/moving-text/moving-text.modal.d.ts +19 -0
- package/lib/sections/service-section/service-section.model.d.ts +3 -1
- package/lib/services/events.service.d.ts +1 -0
- package/lib/styles/index.d.ts +5 -0
- package/lib/styles/style.model.d.ts +5 -1
- package/lib/styles/types.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/simpo-component-library-3.5.46.tgz +0 -0
- package/src/lib/styles/global-styles.css +191 -191
- package/simpo-component-library-3.5.43.tgz +0 -0
@@ -410,10 +410,10 @@ export class PaymentDetailsComponent {
|
|
410
410
|
this.feeStructure.totalFee += amount;
|
411
411
|
}
|
412
412
|
}
|
413
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
414
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaymentDetailsComponent, isStandalone: true, selector: "simpo-payment-details", inputs: { admissionData: "admissionData", subscriptionsData: "subscriptionsData", termPaymentList: "termPaymentList" }, ngImport: i0, template: "<!-- <section class=\"main-section\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"heading left-side\">\n Admission Fee\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\n <div class=\"heading mb-20\">{{configList}}</div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\n <p class=\"heading\">{{type}}</p>\n\n <table class=\"subscription-table w-100\">\n <thead>\n <th>Subscription Title</th>\n <th>Monthly</th>\n <th>Quaterly</th>\n <th>Yearly</th>\n <th>On Demand</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\n <td>{{data.subName}}</td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['MONTHLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['QUARTERLY']}}\n </label>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\n </div>\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ANNUALLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ONDEMAND']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"left-side mt-10\">\n <p class=\"heading\">Payment Plan</p>\n\n <div class=\"d-flex g-2\">\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Annually\n </label>\n </div>\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Term\n </label>\n </div>\n </div>\n\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\n <mat-form-field class=\"input-text\" appearance=\"outline\">\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n </div>\n <div class=\"col-md-6 right-side\">\n <div class=\"heading mb-20\">\n Fee Calculation\n </div>\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\n </div>\n\n <div class=\"total-fee\">\n <div class=\"heading mb-5\">\n Total Fee\n </div>\n <div class=\"amount\">\n \u20B9 {{feeStructure.totalAmount}}\n </div>\n </div>\n </div>\n </div>\n</section> -->\n\n\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\n <div class=\"left_payment_details h-100 p-2\">\n <div class=\"fees_section\">\n <div class=\"sec_title\">\n Fees\n </div>\n <div class=\"mt-2 all_fee_configs\">\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\n </div>\n <div *ngIf=\"item.termsList.length > 0\">\n <div class=\"change_selection\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\n name=\"termOption_{{ item.feeHead.id}}\"\n (change)=\"changeTermValue(item)\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\n <div class=\"check_data\">\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"subscriptions_list mt-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"title\">Transport Fee</div>\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.stopName | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.vehicleType | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of routeValues\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\n\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\n <div class=\"fee_title\">\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n -\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n )</span>\n </div>\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\n </div>\n </div>\n\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\n <div class=\"title\">Subscriptions</div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of subscriptionsData\">\n <div class=\"top_1\">\n <div class=\"d-flex align-items-center gap-3\">\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\n <div class=\"subscription_title\">\n {{item.subscriptionTitle}}\n </div>\n </div>\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\n [disabled]=\"!disableSubscriptionSelection(item)\">\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\n </div>\n <div class=\"single_value\">\n {{subV.amount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"right_payment_details h-100\">\n <div class=\"total_payment_details h-100 w-100 p-3\">\n <div class=\"mt-2 calculation_table\">\n <div class=\"calculation_single_part\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Total Academic Fee Breakdown\n </div>\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\n \u20B9 {{item.amount}}\n </span>\n <span\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of item.termsList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Transport Fee\n </div>\n <ng-container>\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\n <div class=\"fee_amount\"\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\n \u20B9\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\n *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Subscriptions\n </div>\n <div class=\"listing_selected_suscriptions mt-2\">\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\n <ng-container>\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\n <div class=\"key\">\n {{item.frequency | titlecase}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{item.pricing[item.frequency]}}\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"footer_section total_container\">\n <div class=\"footer_title\">Grand Total Fee</div>\n <div class=\"d-flex justify-content-center align-items-center\">\n \u20B9 {{feeStructure?.totalFee}}\n </div>\n </div>\n </div>\n </div>\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.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: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i9.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i9.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] }); }
|
413
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, deps: [{ token: i1.ElementServiceService }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
414
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: PaymentDetailsComponent, isStandalone: true, selector: "simpo-payment-details", inputs: { admissionData: "admissionData", subscriptionsData: "subscriptionsData", termPaymentList: "termPaymentList" }, ngImport: i0, template: "<!-- <section class=\"main-section\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <div class=\"heading left-side\">\r\n Admission Fee\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\r\n <div class=\"heading mb-20\">{{configList}}</div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\r\n <p class=\"heading\">{{type}}</p>\r\n\r\n <table class=\"subscription-table w-100\">\r\n <thead>\r\n <th>Subscription Title</th>\r\n <th>Monthly</th>\r\n <th>Quaterly</th>\r\n <th>Yearly</th>\r\n <th>On Demand</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\r\n <td>{{data.subName}}</td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['MONTHLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['QUARTERLY']}}\r\n </label>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ANNUALLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ONDEMAND']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\">\r\n <p class=\"heading\">Payment Plan</p>\r\n\r\n <div class=\"d-flex g-2\">\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Annually\r\n </label>\r\n </div>\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Term\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\r\n <mat-form-field class=\"input-text\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\r\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 right-side\">\r\n <div class=\"heading mb-20\">\r\n Fee Calculation\r\n </div>\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\r\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\r\n </div>\r\n\r\n <div class=\"total-fee\">\r\n <div class=\"heading mb-5\">\r\n Total Fee\r\n </div>\r\n <div class=\"amount\">\r\n \u20B9 {{feeStructure.totalAmount}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section> -->\r\n\r\n\r\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\r\n <div class=\"left_payment_details h-100 p-2\">\r\n <div class=\"fees_section\">\r\n <div class=\"sec_title\">\r\n Fees\r\n </div>\r\n <div class=\"mt-2 all_fee_configs\">\r\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\r\n </div>\r\n <div *ngIf=\"item.termsList.length > 0\">\r\n <div class=\"change_selection\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\r\n name=\"termOption_{{ item.feeHead.id}}\"\r\n (change)=\"changeTermValue(item)\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\">\r\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\r\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"title\">Transport Fee</div>\r\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\r\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.stopName | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\r\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.vehicleType | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of routeValues\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\r\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\r\n <div class=\"fee_title\">\r\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\r\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n -\r\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n )</span>\r\n </div>\r\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\r\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\r\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\r\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\r\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\r\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\r\n <div class=\"title\">Subscriptions</div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of subscriptionsData\">\r\n <div class=\"top_1\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\r\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\r\n <div class=\"subscription_title\">\r\n {{item.subscriptionTitle}}\r\n </div>\r\n </div>\r\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\r\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\r\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\r\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\r\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\r\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\r\n [disabled]=\"!disableSubscriptionSelection(item)\">\r\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\r\n </div>\r\n <div class=\"single_value\">\r\n {{subV.amount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"right_payment_details h-100\">\r\n <div class=\"total_payment_details h-100 w-100 p-3\">\r\n <div class=\"mt-2 calculation_table\">\r\n <div class=\"calculation_single_part\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Total Academic Fee Breakdown\r\n </div>\r\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\r\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\r\n \u20B9 {{item.amount}}\r\n </span>\r\n <span\r\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of item.termsList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Transport Fee\r\n </div>\r\n <ng-container>\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\r\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\"\r\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\r\n \u20B9\r\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\r\n *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\r\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Subscriptions\r\n </div>\r\n <div class=\"listing_selected_suscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\r\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\r\n <ng-container>\r\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\r\n <div class=\"key\">\r\n {{item.frequency | titlecase}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{item.pricing[item.frequency]}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"footer_section total_container\">\r\n <div class=\"footer_title\">Grand Total Fee</div>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n \u20B9 {{feeStructure?.totalFee}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i9.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i9.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] }); }
|
415
415
|
}
|
416
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.
|
416
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, decorators: [{
|
417
417
|
type: Component,
|
418
418
|
args: [{ selector: 'simpo-payment-details', standalone: true, imports: [
|
419
419
|
CommonModule,
|
@@ -426,7 +426,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
426
426
|
MatDialogModule,
|
427
427
|
MatAutocompleteModule,
|
428
428
|
MatInputModule
|
429
|
-
], template: "<!-- <section class=\"main-section\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"heading left-side\">\n Admission Fee\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\n <div class=\"heading mb-20\">{{configList}}</div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\n <p class=\"heading\">{{type}}</p>\n\n <table class=\"subscription-table w-100\">\n <thead>\n <th>Subscription Title</th>\n <th>Monthly</th>\n <th>Quaterly</th>\n <th>Yearly</th>\n <th>On Demand</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\n <td>{{data.subName}}</td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['MONTHLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['QUARTERLY']}}\n </label>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\n </div>\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ANNUALLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ONDEMAND']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"left-side mt-10\">\n <p class=\"heading\">Payment Plan</p>\n\n <div class=\"d-flex g-2\">\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Annually\n </label>\n </div>\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Term\n </label>\n </div>\n </div>\n\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\n <mat-form-field class=\"input-text\" appearance=\"outline\">\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n </div>\n <div class=\"col-md-6 right-side\">\n <div class=\"heading mb-20\">\n Fee Calculation\n </div>\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\n </div>\n\n <div class=\"total-fee\">\n <div class=\"heading mb-5\">\n Total Fee\n </div>\n <div class=\"amount\">\n \u20B9 {{feeStructure.totalAmount}}\n </div>\n </div>\n </div>\n </div>\n</section> -->\n\n\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\n <div class=\"left_payment_details h-100 p-2\">\n <div class=\"fees_section\">\n <div class=\"sec_title\">\n Fees\n </div>\n <div class=\"mt-2 all_fee_configs\">\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\n </div>\n <div *ngIf=\"item.termsList.length > 0\">\n <div class=\"change_selection\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\n name=\"termOption_{{ item.feeHead.id}}\"\n (change)=\"changeTermValue(item)\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\n <div class=\"check_data\">\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"subscriptions_list mt-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"title\">Transport Fee</div>\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.stopName | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.vehicleType | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of routeValues\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\n\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\n <div class=\"fee_title\">\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n -\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n )</span>\n </div>\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\n </div>\n </div>\n\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\n <div class=\"title\">Subscriptions</div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of subscriptionsData\">\n <div class=\"top_1\">\n <div class=\"d-flex align-items-center gap-3\">\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\n <div class=\"subscription_title\">\n {{item.subscriptionTitle}}\n </div>\n </div>\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\n [disabled]=\"!disableSubscriptionSelection(item)\">\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\n </div>\n <div class=\"single_value\">\n {{subV.amount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"right_payment_details h-100\">\n <div class=\"total_payment_details h-100 w-100 p-3\">\n <div class=\"mt-2 calculation_table\">\n <div class=\"calculation_single_part\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Total Academic Fee Breakdown\n </div>\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\n \u20B9 {{item.amount}}\n </span>\n <span\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of item.termsList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Transport Fee\n </div>\n <ng-container>\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\n <div class=\"fee_amount\"\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\n \u20B9\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\n *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Subscriptions\n </div>\n <div class=\"listing_selected_suscriptions mt-2\">\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\n <ng-container>\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\n <div class=\"key\">\n {{item.frequency | titlecase}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{item.pricing[item.frequency]}}\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"footer_section total_container\">\n <div class=\"footer_title\">Grand Total Fee</div>\n <div class=\"d-flex justify-content-center align-items-center\">\n \u20B9 {{feeStructure?.totalFee}}\n </div>\n </div>\n </div>\n </div>\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}\n"] }]
|
429
|
+
], template: "<!-- <section class=\"main-section\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <div class=\"heading left-side\">\r\n Admission Fee\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\r\n <div class=\"heading mb-20\">{{configList}}</div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\r\n <p class=\"heading\">{{type}}</p>\r\n\r\n <table class=\"subscription-table w-100\">\r\n <thead>\r\n <th>Subscription Title</th>\r\n <th>Monthly</th>\r\n <th>Quaterly</th>\r\n <th>Yearly</th>\r\n <th>On Demand</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\r\n <td>{{data.subName}}</td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['MONTHLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['QUARTERLY']}}\r\n </label>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ANNUALLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ONDEMAND']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\">\r\n <p class=\"heading\">Payment Plan</p>\r\n\r\n <div class=\"d-flex g-2\">\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Annually\r\n </label>\r\n </div>\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Term\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\r\n <mat-form-field class=\"input-text\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\r\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 right-side\">\r\n <div class=\"heading mb-20\">\r\n Fee Calculation\r\n </div>\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\r\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\r\n </div>\r\n\r\n <div class=\"total-fee\">\r\n <div class=\"heading mb-5\">\r\n Total Fee\r\n </div>\r\n <div class=\"amount\">\r\n \u20B9 {{feeStructure.totalAmount}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section> -->\r\n\r\n\r\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\r\n <div class=\"left_payment_details h-100 p-2\">\r\n <div class=\"fees_section\">\r\n <div class=\"sec_title\">\r\n Fees\r\n </div>\r\n <div class=\"mt-2 all_fee_configs\">\r\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\r\n </div>\r\n <div *ngIf=\"item.termsList.length > 0\">\r\n <div class=\"change_selection\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\r\n name=\"termOption_{{ item.feeHead.id}}\"\r\n (change)=\"changeTermValue(item)\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\">\r\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\r\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"title\">Transport Fee</div>\r\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\r\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.stopName | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\r\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.vehicleType | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of routeValues\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\r\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\r\n <div class=\"fee_title\">\r\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\r\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n -\r\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n )</span>\r\n </div>\r\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\r\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\r\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\r\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\r\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\r\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\r\n <div class=\"title\">Subscriptions</div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of subscriptionsData\">\r\n <div class=\"top_1\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\r\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\r\n <div class=\"subscription_title\">\r\n {{item.subscriptionTitle}}\r\n </div>\r\n </div>\r\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\r\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\r\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\r\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\r\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\r\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\r\n [disabled]=\"!disableSubscriptionSelection(item)\">\r\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\r\n </div>\r\n <div class=\"single_value\">\r\n {{subV.amount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"right_payment_details h-100\">\r\n <div class=\"total_payment_details h-100 w-100 p-3\">\r\n <div class=\"mt-2 calculation_table\">\r\n <div class=\"calculation_single_part\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Total Academic Fee Breakdown\r\n </div>\r\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\r\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\r\n \u20B9 {{item.amount}}\r\n </span>\r\n <span\r\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of item.termsList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Transport Fee\r\n </div>\r\n <ng-container>\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\r\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\"\r\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\r\n \u20B9\r\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\r\n *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\r\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Subscriptions\r\n </div>\r\n <div class=\"listing_selected_suscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\r\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\r\n <ng-container>\r\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\r\n <div class=\"key\">\r\n {{item.frequency | titlecase}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{item.pricing[item.frequency]}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"footer_section total_container\">\r\n <div class=\"footer_title\">Grand Total Fee</div>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n \u20B9 {{feeStructure?.totalFee}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}\n"] }]
|
430
430
|
}], ctorParameters: () => [{ type: i1.ElementServiceService }, { type: i2.MatSnackBar }], propDecorators: { admissionData: [{
|
431
431
|
type: Input
|
432
432
|
}], subscriptionsData: [{
|
@@ -434,4 +434,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
434
434
|
}], termPaymentList: [{
|
435
435
|
type: Input
|
436
436
|
}] } });
|
437
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztBQW1CekQsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUNVLFdBQW1DLEVBQ25DLFFBQXNCO1FBRHRCLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUNuQyxhQUFRLEdB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Q1gsZUFBZSwrTEFDZixrQkFBa0IseU9BQ2xCLGVBQWUsOEJBQ2YsY0FBYyxvbEJBQ2QsaUJBQWlCLG9ZQUNqQixlQUFlLDhCQUNmLHFCQUFxQix1ckJBQ3JCLGNBQWM7OzRGQUtMLHVCQUF1QjtrQkFsQm5DLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixjQUFjO3FCQUNmO29IQUtRLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgIE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgRWxlbWVudFNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZWRpdG9yLXNlcnZpY2Uuc2VydmljZSdcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVNb2R1bGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1wYXltZW50LWRldGFpbHMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLCBcbiAgICBGb3Jtc01vZHVsZSwgXG4gICAgTWF0T3B0aW9uTW9kdWxlLCBcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsIFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXRSYWRpb01vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wYXltZW50LWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIFBheW1lbnREZXRhaWxzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgYWRtaXNzaW9uRGF0YTogYW55O1xuICBASW5wdXQoKSBzdWJzY3JpcHRpb25zRGF0YTogYW55W10gPSBbXVxuICBASW5wdXQoKSB0ZXJtUGF5bWVudExpc3Q6IGFueVtdID0gW107XG5cbiAgT2JqZWN0ID0gT2JqZWN0XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZSA6IEVsZW1lbnRTZXJ2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIHNuYWNrQmFyIDogTWF0U25hY2tCYXJcbiAgKSB7fVxuXG4gIGZlZVN0cnVjdHVyZTogYW55ID0ge1xuICAgIFwiaWRcIjogJzEyMzQnLFxuICAgIFwiYnVzaW5lc3NEZXRhaWxzXCI6IHtcbiAgICAgIFwiaWRcIjogJzEyMzQnXG4gICAgfSxcbiAgICBcImdyYWRlc1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiX2lkXCI6IFwiMTIzNFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJSVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcIl9pZFwiOiBcIjEyMzRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiR3JhZGUgSVZcIlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJib2FyZFwiOiBcIlNUQVRFXCIsXG4gICAgXCJhY2FkZW1pY1llYXJTdGFydFwiOiAyMDI0LFxuICAgIFwiYWNhZGVtaWNZZWFyRW5kXCI6IDIwMjUsXG4gICAgXCJmZWVDb25maWdzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJmZWVUeXBlSWRcIjogJzEyMzI0JyxcbiAgICAgICAgXCJmZWVIZWFkSWRcIjogJzEyMzQnLFxuICAgICAgICBcImZlZVR5cGVcIjogXCJUdXRpb24gZmVlXCIsXG4gICAgICAgIFwiZmVlSGVhZFwiOiBcImV4YW0gZmVlXCIsXG4gICAgICAgIFwiYW1vdW50XCI6IDMwMCxcbiAgICAgICAgXCJkaXNjb3VudEFtb3VudFwiOiAwLFxuICAgICAgICBcImlzRml4ZWRcIjogZmFsc2VcbiAgICAgIH1cbiAgICBdLFxuICAgIFwic3Vic2NyaXB0aW9uUGxhbnNcIjogW10sXG4gICAgXCJ0b3RhbEFtb3VudFwiOiAzMDAsXG4gICAgXCJjcmVhdGVkVGltZXN0YW1wXCI6IHtcbiAgICAgIFwiJGRhdGVcIjogXCIyMDI0LTEyLTE1VDA3OjEwOjU0Ljg4OVpcIlxuICAgIH0sXG4gICAgXCJ1cGRhdGVkVGltZXN0YW1wXCI6IHtcbiAgICAgIFwiJGRhdGVcIjogXCIyMDI0LTEyLTE1VDA3OjEwOjU0Ljg4OVpcIlxuICAgIH0sXG4gICAgXCJhY3RpdmVcIjogdHJ1ZSxcbiAgfVxuXG5cbiAgZmVlQ29uZmlnOiBhbnk7XG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucyA9W11cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnNEYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZihlbGVtZW50Lm5ld1ByaWNpbmdMaXN0KXtcbiAgICAgICAgZWxlbWVudC5uZXdQcmljaW5nTGlzdC5mb3JFYWNoKChlbGVtOmFueSkgPT4ge1xuICAgICAgICAgIGVsZW0uc2VsZWN0ZVN0YXR1cyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmFkbWlzc2lvbkRhdGE/LnN0dWRlbnRGZWVTdHJ1Y3R1cmVWMj8uZmVlQ29uZmlnLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50ZXJtc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBpZighZWxlbWVudC5zZWxlY3RlZFRlcm1WYWx1ZSl7XG4gICAgICAgICAgZWxlbWVudC5zZWxlY3RlZFRlcm1WYWx1ZSA9ICdTSU5HTEUnO1xuICAgICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkVGVybVZhbHVlID09PSAnU0lOR0xFJykge1xuICAgICAgICAgICAgZWxlbWVudC50ZXJtID0gZmFsc2U7XG4gICAgICAgICAgICBlbGVtZW50LnBhaWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5wYWlkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5wYWlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZlZVN0cnVjdHVyZSA9IHRoaXMuYWRtaXNzaW9uRGF0YT8uc3R1ZGVudEZlZVN0cnVjdHVyZVYyO1xuICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zRGF0YS5mb3JFYWNoKHN1YiA9PiB7XG4gICAgICAgIHN1Yi5uZXdQcmljaW5nTGlzdC5mb3JFYWNoKChwbDogYW55KSA9PiB7XG4gICAgICAgICAgcGwuc2VsZWN0ZVN0YXR1cyA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZWxlbWVudC5mcmVxdWVuY3kgPT09IHBsLm5hbWU7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc1N1YnNjcmlwdGlvblNlbGVjdGVkKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICBcbiAgICB0aGlzLmdldEFsbFN0b3BzKCk7XG4gICAgdGhpcy5nZXRWZWhpY2xlVHlwZXMoKTtcbiAgfVxuXG5cbiAgc3RvcHNMaXN0OiBhbnkgPSBbXTtcbiAgZmlsdGVyZWRTdG9wc0xpc3QgOiBhbnkgPSBbXTtcbiAgdmVoaWNsZVR5cGVzTGlzdCA6IGFueSA9W107XG4gIGZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdDogYW55ID0gW107XG5cbiAgc3RvcFNlYXJjaFRleHQ6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFN0b3A6IGFueTtcbiAgc2VsZWN0ZWRWZWhpY2xlVHlwZTogYW55O1xuICByb3V0ZVZhbHVlczogYW55ID0gW107XG4gIHZlaGljbGVUeXBlU2VhcmNoVGV4dDogYW55ID0gJyc7XG4gIGdldEFsbFN0b3BzKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsU3RvcHModGhpcy5hZG1pc3Npb25EYXRhPy5idXNpbmVzc0RldGFpbHM/LmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcHNMaXN0ID0gcmVzLmRhdGEuZGF0YVxuICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcHNMaXN0ID0gWy4uLnRoaXMuc3RvcHNMaXN0XTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICBlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IGVyci5zdGF0dXNUZXh0LFxuICAgICAgICAgICdDbG9zZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246MzUwMFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmaWx0ZXJTdG9wcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RvcFNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSBbLi4udGhpcy5zdG9wc0xpc3RdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zdG9wU2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgdGhpcy5maWx0ZXJlZFN0b3BzTGlzdCA9IHRoaXMuc3RvcHNMaXN0LmZpbHRlcigoc3RvcDphbnkpID0+XG4gICAgICAgIHN0b3Auc3RvcE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvblN0b3BTZWxlY3Rpb24oZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUgPSAnJztcbiAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcbiAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gbnVsbFxuICAgIGxldCBzZWxlY3RlZFN0dWRlbnQ6IGFueTtcbiAgICB0aGlzLnN0b3BzTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuc3RvcE5hbWUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnQub3B0aW9uLnZhbHVlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgc2VsZWN0ZWRTdHVkZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3AgPSBlbGVtZW50O1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2VsZWN0ZWRTdG9wJyxKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkU3RvcCkpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRWZWhpY2xlVHlwZXMoKSB7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBcImJ1c2luZXNzSWRcIjogdGhpcy5hZG1pc3Npb25EYXRhID8gdGhpcy5hZG1pc3Npb25EYXRhLmJ1c2luZXNzRGV0YWlscy5pZCA6ICcnLFxuICAgICAgXCJwYWdlTm9cIjogMCxcbiAgICAgIFwicGFnZVNpemVcIjogMTAwMDAsXG4gICAgICBcImlzUGFnaW5hdGlvblwiOiBmYWxzZVxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbFZlaGljbGVUeXBlcyhkYXRhKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOmFueSkgPT57XG4gICAgICAgICB0aGlzLnZlaGljbGVUeXBlc0xpc3QgPSByZXMuZGF0YS5kYXRhXG4gICAgICAgICB0aGlzLmZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdCA9IFsuLi50aGlzLnZlaGljbGVUeXBlc0xpc3RdO1xuICAgICAgICAgXG4gICAgICAgICBjb25zdCBzZWxlY3RlZFN0b3AgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZWxlY3RlZFN0b3AnKSB8fCAnbnVsbCcpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFZlaGljbGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZWxlY3RlZFZlaGljbGUnKSB8fCAnbnVsbCcpO1xuXG4gICAgICAgIHRoaXMuc3RvcFNlYXJjaFRleHQgPSBzZWxlY3RlZFN0b3A/LnN0b3BOYW1lIHx8ICcnO1xuICAgICAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9IHNlbGVjdGVkVmVoaWNsZT8udmVoaWNsZVR5cGUgfHwgJyc7XG4gICAgICAgIGlmKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT0gbnVsbCl7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3AgPSBzZWxlY3RlZFN0b3A7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlID0gc2VsZWN0ZWRWZWhpY2xlXG4gICAgICAgICAgdGhpcy5nZXRWZWhpY2xlUm91dGVzQnlTdG9wcygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgZmlsdGVyZVZlaGljbGVUeXBlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmVoaWNsZVR5cGVTZWFyY2hUZXh0KSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdCA9IFsuLi50aGlzLnZlaGljbGVUeXBlc0xpc3RdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMuZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0ID0gdGhpcy52ZWhpY2xlVHlwZXNMaXN0LmZpbHRlcigoc3RvcDphbnkpID0+XG4gICAgICAgIHN0b3AudmVoaWNsZVR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvblZlaGljbGVUeXBlU2VsZWN0aW9uKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnJlbW92ZVRyYXNwb3J0RmVlKCk7XG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IG51bGxcbiAgICB0aGlzLnZlaGljbGVUeXBlc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnZlaGljbGVUeXBlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkgPT09IGV2ZW50Lm9wdGlvbi52YWx1ZS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSA9IGVsZW1lbnQ7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZFZlaGljbGUnLEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSkpXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5nZXRWZWhpY2xlUm91dGVzQnlTdG9wcygpO1xuICB9XG5cbiAgZ2V0VmVoaWNsZVJvdXRlc0J5U3RvcHMoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRWZWhpY2xlUm91dGVzKHRoaXMuc2VsZWN0ZWRTdG9wLmlkLCB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUudmVoaWNsZVR5cGVJZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzLmRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9ICdTSU5HTEUnO1xuICAgICAgICAgICAgZWxlbWVudC5jaGFyZ2VzLmFtb3VudCA9IGVsZW1lbnQuY2hhcmdlcy50b3RhbEFtb3VudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSByZXMuZGF0YVswXTtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcylcbiAgICAgICAgICB0aGlzLnJvdXRlVmFsdWVzID0gcmVzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgICAgYCR7dGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlLnZlaGljbGVUeXBlfSBkb2Vzbid0IGhhdmUgYW55IHJvdXRlc2AsXG4gICAgICAgICAgICAnT2snLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkdXJhdGlvbjozNTAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICBlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IGVyci5zdGF0dXNUZXh0LFxuICAgICAgICAgICdDbG9zZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246MzUwMFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIClcbiAgfVxuXG5cbiAgZGVmYXVsdEltYWdlOiBzdHJpbmcgPSAnaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy85MTcwNjdjMTczNDMzNzI4MDMwM2NhbmNlbC5wbmcnO1xuXG4gIHNlbGVjdGVkSXRlbTogYW55XG4gIGNoYW5nZVRlcm1WYWx1ZShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07XG4gIFxuICAgIGlmIChpdGVtLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTScpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgaXRlbSk7IFxuICAgICAgaXRlbS50ZXJtID0gdHJ1ZTtcbiAgICAgIGl0ZW0ucGFpZCA9IGZhbHNlO1xuICAgIH0gXG4gICAgXG4gICAgZWxzZSB7XG4gICAgICBpdGVtLnRlcm0gPSBmYWxzZTtcbiAgICAgIGl0ZW0udGVybXNMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBlbGVtZW50KTtcbiAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICBcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCBpdGVtKTsgXG4gICAgfVxuICB9XG5cbiAgYWRkVGVybXMoZXY6IGFueSwgaXRlbTogYW55KSB7XG4gICAgaWYgKGV2LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0pXG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLnRlcm1zTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQudGVybUlkID09IGl0ZW0udGVybUlkKSB7XG4gICAgICAgIGVsZW1lbnQuc2VsZWN0ZWQgPSBldi50YXJnZXQuY2hlY2tlZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldE9yZGluYWxTdWZmaXgoaTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBqID0gaSAlIDEwLFxuICAgICAgayA9IGkgJSAxMDA7XG4gICAgaWYgKGogPT0gMSAmJiBrICE9IDExKSB7XG4gICAgICByZXR1cm4gaSArIFwic3RcIjtcbiAgICB9XG4gICAgaWYgKGogPT0gMiAmJiBrICE9IDEyKSB7XG4gICAgICByZXR1cm4gaSArIFwibmRcIjtcbiAgICB9XG4gICAgaWYgKGogPT0gMyAmJiBrICE9IDEzKSB7XG4gICAgICByZXR1cm4gaSArIFwicmRcIjtcbiAgICB9XG4gICAgcmV0dXJuIGkgKyBcInRoXCI7XG4gIH1cblxuICBpc1N1YnNjcmlwdGlvblNlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuc29tZShcbiAgICAgIChwbGFuOiBhbnkpID0+IHBsYW4uc3Vic2NyaXB0aW9uSWQgPT09IGl0ZW0uc3Vic2NyaXB0aW9uSWRcbiAgICApO1xuICB9XG5cbiAgb25TdWJzY3JpcHRpb25JdGVtQ2hhbmdlKGV2ZW50OiBhbnksIGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LmNoZWNrZWQ7XG4gIFxuICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKFxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgICApO1xuICBcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGl0ZW0ubmV3UHJpY2luZ0xpc3QuZm9yRWFjaCgoZWw6YW55KSA9PiBlbC5zZWxlY3RlU3RhdHVzID0gZmFsc2UpO1xuICAgICAgICBpdGVtLm5ld1ByaWNpbmdMaXN0WzBdLnNlbGVjdGVTdGF0dXMgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5wdXNoKHtcbiAgICAgICAgICBzdWJJZDogaXRlbS5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgICBzdWJOYW1lOiBpdGVtLnN1YnNjcmlwdGlvblRpdGxlLFxuICAgICAgICAgIGZyZXF1ZW5jeTogaXRlbS5uZXdQcmljaW5nTGlzdFswXS5uYW1lLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblR5cGU6IGl0ZW0uc3Vic2NyaXB0aW9uVHlwZS5zdWJzY3JpcHRpb25UeXBlTmFtZSxcbiAgICAgICAgICBwcmljaW5nOiBpdGVtLnByaWNpbmcsXG4gICAgICAgICAgaW5jbHVzaW9uczogaXRlbS5pbmNsdXNpb25zXG4gICAgICAgIH0pO1xuICBcbiAgICAgICAgY29uc3QgYWRkQW1vdW50ID0gaXRlbS5wcmljaW5nW2l0ZW0ubmV3UHJpY2luZ0xpc3RbMF0ubmFtZV07XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCB7IGFtb3VudDogYWRkQW1vdW50IH0pO1xuICAgICAgfVxuICBcbiAgICB9IGVsc2Uge1xuXG4gICAgICBjb25zdCByZW1vdmVkUGxhbiA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5maW5kKFxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgICApO1xuICBcbiAgICAgIGlmIChyZW1vdmVkUGxhbikge1xuICAgICAgICBjb25zdCByZW1vdmVBbW91bnQgPSBpdGVtLnByaWNpbmdbcmVtb3ZlZFBsYW4uZnJlcXVlbmN5XTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCB7IGFtb3VudDogcmVtb3ZlQW1vdW50IH0pO1xuICAgICAgfVxuICBcbiAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucyA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5maWx0ZXIoXG4gICAgICAgIChwbGFuOiBhbnkpID0+IHBsYW4uc3ViSWQgIT09IGl0ZW0uc3Vic2NyaXB0aW9uSWRcbiAgICAgICk7XG4gIFxuICAgICAgaXRlbS5uZXdQcmljaW5nTGlzdC5mb3JFYWNoKChlbDphbnkpID0+IGVsLnNlbGVjdGVTdGF0dXMgPSBmYWxzZSk7XG4gICAgfVxuXG4gIH1cblxuICB0b2dnbGVTdWJzY3JpcHRpb25TZWxlY3Rpb24obGlzdDogYW55W10sIHNlbGVjdGVkSW5kZXg6IG51bWJlciwgcGFyZW50SXRlbTogYW55KSB7XG4gICAgbGV0IHVuc2VsZWN0ZWRJdGVtOiBhbnkgPSBudWxsO1xuICAgIGxldCBwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCA9IGxpc3QuZmluZEluZGV4KGVsID0+IGVsLnNlbGVjdGVTdGF0dXMpO1xuXG4gICAgaWYgKHByZXZpb3VzbHlTZWxlY3RlZEluZGV4ICE9PSAtMSAmJiBwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCAhPT0gc2VsZWN0ZWRJbmRleCkge1xuICAgICAgdW5zZWxlY3RlZEl0ZW0gPSBsaXN0W3ByZXZpb3VzbHlTZWxlY3RlZEluZGV4XTtcbiAgICB9XG4gICAgbGlzdC5mb3JFYWNoKChlbCwgaW5kZXgpID0+IHtcbiAgICAgIGVsLnNlbGVjdGVTdGF0dXMgPSBpbmRleCA9PT0gc2VsZWN0ZWRJbmRleDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGxpc3Rbc2VsZWN0ZWRJbmRleF07XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFuID0gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLmZpbmQoXG4gICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkID09PSBwYXJlbnRJdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgKTtcblxuICAgIGlmIChzZWxlY3RlZFBsYW4pIHtcbiAgICAgIHNlbGVjdGVkUGxhbi5mcmVxdWVuY3kgPSBzZWxlY3RlZEl0ZW0ubmFtZTtcbiAgICB9XG5cbiAgICBpZiAodW5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgIGNvbnN0IHJlbW92ZUFtb3VudCA9IHBhcmVudEl0ZW0ucHJpY2luZ1t1bnNlbGVjdGVkSXRlbS5uYW1lXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgeyAuLi51bnNlbGVjdGVkSXRlbSwgYW1vdW50OiByZW1vdmVBbW91bnQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgY29uc3QgYWRkQW1vdW50ID0gcGFyZW50SXRlbS5wcmljaW5nW3NlbGVjdGVkSXRlbS5uYW1lXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCB7IC4uLnNlbGVjdGVkSXRlbSwgYW1vdW50OiBhZGRBbW91bnQgfSk7XG4gICAgfVxuXG4gIH1cblxuICBoYXNBY3RpdmVTdWJzY3JpcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMubGVuZ3RoID4gMFxuICB9XG5cbiAgZGlzYWJsZVN1YnNjcmlwdGlvblNlbGVjdGlvbihpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoXG4gICAgICAoZWxlbTogYW55KSA9PiBlbGVtLnN1YklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgKTtcbiAgfVxuXG4gIGFkZGluZ1RyYW5zcG9ydEZlZSgpIHtcbiAgICBpZiAodGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm0pIHtcbiAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgZWxlbWVudClcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcylcbiAgICB9XG4gIH1cbiAgcmVtb3ZlVHJhc3BvcnRGZWUoKSB7XG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtKSB7XG4gICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBlbGVtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DaGVja2JveENoYW5nZShpdGVtOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICAvLyBpZih0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsKVxuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IGl0ZW07XG4gICAgICB0aGlzLmFkZGluZ1RyYW5zcG9ydEZlZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRQaWNrdXBUaW1lKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gaXRlbS5maW5kKChlbGVtZW50OmFueSkgPT4gZWxlbWVudC5zdG9wLmlkID09PSB0aGlzLnNlbGVjdGVkU3RvcC5pZCk7XG4gICAgY29uc3QgaXNvVGltZSA9IG5ldyBEYXRlKGAxOTcwLTAxLTAxVCR7bWF0Y2hlZEl0ZW0ucGlja3VwLnBpY2t1cFRpbWV9YCk7XG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XG4gIH1cblxuICBnZXREcm9wdGltZShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBtYXRjaGVkSXRlbSA9IGl0ZW0uZmluZCgoZWxlbWVudDphbnkpID0+IGVsZW1lbnQuc3RvcC5pZCA9PT0gdGhpcy5zZWxlY3RlZFN0b3AuaWQpO1xuICAgIGNvbnN0IGlzb1RpbWUgPSBuZXcgRGF0ZShgMTk3MC0wMS0wMVQke21hdGNoZWRJdGVtLmRyb3AuZHJvcFRpbWV9YCk7XG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XG4gIH1cblxuICBjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbTogYW55KSB7XG4gICAgaWYgKGl0ZW0uY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0uY2hhcmdlcylcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtID0gdHJ1ZTtcbiAgICAgIGl0ZW0uY2hhcmdlcy5wYWlkID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXRlbS5jaGFyZ2VzLnRlcm0gPSBmYWxzZTtcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCBpdGVtLmNoYXJnZXMpXG4gICAgfVxuICB9XG5cbiAgYWRkU2luZ2xlU3RvcChldjphbnksIGl0ZW06IGFueSkge1xuICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtKVxuICAgIH1cblxuICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnRlcm1JZCA9PSBpdGVtLnRlcm1JZCkge1xuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoY2FsOiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIFxuICAgIGNvbnN0IGFtb3VudCA9IHZhbHVlLmFtb3VudCA/PyB2YWx1ZS50ZXJtQW1vdW50ID8/IDA7XG4gIFxuICAgIGlmIChjYWwgPT09IC0xKSB7XG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSAtPSBhbW91bnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmVlU3RydWN0dXJlLnRvdGFsRmVlICs9IGFtb3VudDtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS0gPHNlY3Rpb24gY2xhc3M9XCJtYWluLXNlY3Rpb25cIj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbGVmdC1zaWRlXCI+XG4gICAgICAgIEFkbWlzc2lvbiBGZWVcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIG10LTEwXCIgKm5nRm9yPVwibGV0IGNvbmZpZ0xpc3Qgb2YgT2JqZWN0LmtleXMoZmVlQ29uZmlnKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi0yMFwiPnt7Y29uZmlnTGlzdH19PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LXNwYWNlIG10LTEwIG1iLTE1XCIgKm5nRm9yPVwibGV0IGNvbmZpZyBvZiBmZWVDb25maWdbY29uZmlnTGlzdF1cIj5cbiAgICAgICAgICA8cCBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTBcIj57e2NvbmZpZy5mZWVIZWFkfX08L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e2NvbmZpZy5hbW91bnR9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZSBtdC0xMFwiICpuZ0Zvcj1cImxldCB0eXBlIG9mIE9iamVjdC5rZXlzKHN1YnNjcmlwdGlvbnMpXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiaGVhZGluZ1wiPnt7dHlwZX19PC9wPlxuXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInN1YnNjcmlwdGlvbi10YWJsZSB3LTEwMFwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0aD5TdWJzY3JpcHRpb24gVGl0bGU8L3RoPlxuICAgICAgICAgICAgPHRoPk1vbnRobHk8L3RoPlxuICAgICAgICAgICAgPHRoPlF1YXRlcmx5PC90aD5cbiAgICAgICAgICAgIDx0aD5ZZWFybHk8L3RoPlxuICAgICAgICAgICAgPHRoPk9uIERlbWFuZDwvdGg+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGEgb2Ygc3Vic2NyaXB0aW9uc1t0eXBlXTtsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgIDx0ZD57e2RhdGEuc3ViTmFtZX19PC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKm5nSWY9XCJkYXRhLnByaWNpbmdbJ1FVQVJURVJMWSddXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgIFt2YWx1ZV09XCInTU9OVEhMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdNT05USExZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ01PTlRITFknXCIgIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleFJhZGlvRGVmYXVsdDJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snTU9OVEhMWSddfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImRlZmF1bHRJbWFnZVwiICpuZ0lmPVwiIWRhdGEucHJpY2luZ1snUVVBUlRFUkxZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKm5nSWY9XCJkYXRhLnByaWNpbmdbJ01PTlRITFknXVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiIFt2YWx1ZV09XCInUVVBUlRFUkxZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ1FVQVJURVJMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdRVUFSVEVSTFknXCIgWyhuZ01vZGVsKV09XCJkYXRhLnNlbGVjdGVkT3B0aW9uXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ1FVQVJURVJMWSddfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydNT05USExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snQU5OVUFMTFknXVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiIFt2YWx1ZV09XCInQU5OVUFMTFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnQU5OVUFMTFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnQU5OVUFMTFknXCIgWyhuZ01vZGVsKV09XCJkYXRhLnNlbGVjdGVkT3B0aW9uXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ119fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydBTk5VQUxMWSddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKm5nSWY9XCJkYXRhLnByaWNpbmdbJ09OREVNQU5EJ11cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ09OREVNQU5EJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ09OREVNQU5EJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ09OREVNQU5EJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydPTkRFTUFORCddfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImRlZmF1bHRJbWFnZVwiICpuZ0lmPVwiIWRhdGEucHJpY2luZ1snT05ERU1BTkQnXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZSBtdC0xMFwiPlxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj5QYXltZW50IFBsYW48L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIChjbGljayk9XCJjaGFuZ2VBbm51YWxQYXltZW50VGVybSgnQU5OVUFMTFknKVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwiXCIgbmFtZT1cInBheW1lbnQtcGxhblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiIFtjaGVja2VkXT1cImFkbWlzc2lvbkRhdGEucGF5bWVudFBsYW5UeXBlID09PSAnQU5OVUFMTFknXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICBBbm51YWxseVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIChjbGljayk9XCJjaGFuZ2VBbm51YWxQYXltZW50VGVybSgnVEVSTScpXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJcIiBuYW1lPVwicGF5bWVudC1wbGFuXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCIgW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdURVJNJ1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgVGVybVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkbWlzc2lvblwiICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdURVJNJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LXRleHRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCJpbnB1dFN0eWxlXCIgcGxhY2Vob2xkZXI9XCItLVNlbGVjdC0tXCIgbXVsdGlwbGU9XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJmZWVTdHJ1Y3R1cmUudGVybVBheW1lbnRMaXN0XCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2FsY3VsYXRlVG90YWxBbW91bnQoKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0ZXJtIG9mIHRlcm1QYXltZW50TGlzdFwiIFt2YWx1ZV09XCJ0ZXJtXCI+dGVybSB7e3Rlcm0udGVybU51bWJlcn19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgcmlnaHQtc2lkZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItMjBcIj5cbiAgICAgICAgRmVlIENhbGN1bGF0aW9uXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBjb25maWcgb2YgZmVlU3RydWN0dXJlLmZlZUNvbmZpZ3NcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tjb25maWcuZmVlSGVhZH19PC9wPlxuICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7Y29uZmlnLmFtb3VudH19PC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBzdWJzY3JpcGl0aW9uIG9mIGZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFuc1wiPlxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTBcIj57e3N1YnNjcmlwaXRpb24uc3ViTmFtZX19PC9wPlxuICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7c3Vic2NyaXBpdGlvbi5wcmljaW5nW3N1YnNjcmlwaXRpb24uZnJlcXVlbmN5XX19PC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1mZWVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItNVwiPlxuICAgICAgICAgIFRvdGFsIEZlZVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFtb3VudFwiPlxuICAgICAgICAgIOKCuSB7e2ZlZVN0cnVjdHVyZS50b3RhbEFtb3VudH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPiAtLT5cblxuXG48c2VjdGlvbiBjbGFzcz1cIm1haW5fcGF5bWVudF9kZXRhaWxzX3NlY3Rpb24gaC0xMDAgdy0xMDAgcC0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICA8ZGl2IGNsYXNzPVwibGVmdF9wYXltZW50X2RldGFpbHMgaC0xMDAgcC0yXCI+XG4gICAgPGRpdiBjbGFzcz1cImZlZXNfc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY190aXRsZVwiPlxuICAgICAgICBGZWVzXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGFsbF9mZWVfY29uZmlnc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZlZVN0cnVjdHVyZT8uZmVlQ29uZmlnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9mZWVfY29uZmlnIHAtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7aXRlbS5mZWVIZWFkID8gaXRlbS5mZWVIZWFkLm5hbWUgOiAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCI+4oK5IHt7aXRlbS5hbW91bnR9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50ZXJtc0xpc3QubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhbmdlX3NlbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBbKG5nTW9kZWwpXT1cIml0ZW0uc2VsZWN0ZWRUZXJtVmFsdWVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJ0ZXJtT3B0aW9uX3t7IGl0ZW0uZmVlSGVhZC5pZH19XCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlVGVybVZhbHVlKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlNJTkdMRVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxM3B4XCI+U2luZ2xlPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJURVJNXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7Zm9udC1zaXplOjEzcHhcIj5UZXJtPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRlcm1Db3VudFwiICpuZ0lmPVwiaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrX2RhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlcm0gb2YgaXRlbS50ZXJtc0xpc3Q7bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlRGF0YSBkLWZsZXggZ2FwLTMgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwiYWRkVGVybXMoJGV2ZW50LHRlcm0pXCIgW2NoZWNrZWRdPVwidGVybS5zZWxlY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhX3ZhbHVlXCI+e3tnZXRPcmRpbmFsU3VmZml4KGkrMSl9fSBUZXJtICjigrkge3t0ZXJtPy50ZXJtQW1vdW50fX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uc19saXN0IG10LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5UcmFuc3BvcnQgRmVlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGluZ190eXBlcyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDozMCVcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbnB1dF9jYXJkIG10LTIgdy0xMDBcIiBzdHlsZT1cImhlaWdodDo0MHB4XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU3RvcFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b0dyYWRlXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcFNlYXJjaFRleHRcIiAoaW5wdXQpPVwiZmlsdGVyU3RvcHMoKVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTNweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG9HcmFkZT1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblN0b3BTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0b3Agb2YgZmlsdGVyZWRTdG9wc0xpc3RcIiBbdmFsdWVdPVwic3RvcC5zdG9wTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgc3RvcC5zdG9wTmFtZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOjMwJVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlucHV0X2NhcmQgbXQtMiB3LTEwMFwiIHN0eWxlPVwiaGVpZ2h0OjQwcHhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBWZWhpY2xlIFR5cGVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9HcmFkZTFcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2ZWhpY2xlVHlwZVNlYXJjaFRleHRcIiAoaW5wdXQpPVwiZmlsdGVyZVZlaGljbGVUeXBlcygpXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0b0dyYWRlMT1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblZlaGljbGVUeXBlU2VsZWN0aW9uKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBzdG9wIG9mIGZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdFwiIFt2YWx1ZV09XCJzdG9wLnZlaGljbGVUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzdG9wLnZlaGljbGVUeXBlIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9hbGxfc3Vic2NyaXB0aW9ucyBtdC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3V0ZVZhbHVlc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9mZWVfY29uZmlnIHAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPT09IGl0ZW1cIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKGl0ZW0sICRldmVudClcIj48L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJ3aWR0aDo5MiVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS50cmFuc3BvcnQucm91dGUgPyBpdGVtLnRyYW5zcG9ydC5yb3V0ZS5uYW1lIDogJ04vQScgfX1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+KDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlBpY2t1cCBUaW1lIDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktc2VtaS1ib2xkLWZvbnQtZmFtaWx5KTtcIj57e2dldFBpY2t1cFRpbWUoaXRlbS50cmFuc3BvcnQuYnVzUm91dGVTdG9wVGltaW5ncylcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZTonaDptbSBhJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIC1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5Ecm9wIFRpbWUgOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1zZW1pLWJvbGQtZm9udC1mYW1pbHkpO1wiPnt7Z2V0RHJvcHRpbWUoaXRlbS50cmFuc3BvcnQuYnVzUm91dGVTdG9wVGltaW5ncylcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZTonaDptbSBhJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCI+4oK5IHt7IGl0ZW0uY2hhcmdlcy50b3RhbEFtb3VudCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uY2hhcmdlcy50ZXJtUGF5bWVudExpc3QubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFuZ2Vfc2VsZWN0aW9uXCIgc3R5bGU9XCJ3aWR0aDo5MCU7bWFyZ2luOjAgYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS5jaGFyZ2VzLnNlbGVjdGVkVGVybVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbSlcIiBbZGlzYWJsZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT09IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJTSU5HTEVcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpOyBmb250LXNpemU6IDEzcHhcIj5TaW5nbGU8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiVEVSTVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7IGZvbnQtc2l6ZTogMTNweFwiPlRlcm08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXJtQ291bnRcIiAqbmdJZj1cIml0ZW0uY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tfZGF0YVwiIHN0eWxlPVwid2lkdGg6NzUlO21hcmdpbjowIGF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBpdGVtLmNoYXJnZXMudGVybVBheW1lbnRMaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZURhdGEgZC1mbGV4IGdhcC0zIGFsaWduLWl0ZW1zLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwiYWRkU2luZ2xlU3RvcCgkZXZlbnQsIHRlcm0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9PSBpdGVtXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhX3ZhbHVlXCI+e3sgZ2V0T3JkaW5hbFN1ZmZpeChpICsgMSkgfX0gVGVybSAo4oK5IHt7dGVybS50ZXJtQW1vdW50fX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25zX2xpc3QgbXQtM1wiICpuZ0lmPVwic3Vic2NyaXB0aW9uc0RhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5TdWJzY3JpcHRpb25zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X2FsbF9zdWJzY3JpcHRpb25zIG10LTJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN1YnNjcmlwdGlvbnNEYXRhXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wXzFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImlzU3Vic2NyaXB0aW9uU2VsZWN0ZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN1YnNjcmlwdGlvbkl0ZW1DaGFuZ2UoJGV2ZW50LCBpdGVtKVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7aXRlbS5zdWJzY3JpcHRpb25UaXRsZX19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uX3R5cGVzXCIgc3R5bGU9XCJ3aWR0aDo4NSU7bWFyZ2luOmF1dG9cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJWIG9mIGl0ZW0ubmV3UHJpY2luZ0xpc3Q7bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9zdWJzY3JwdGlvbiBkLWZsZXggZ2FwLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3RpdGxlIGQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOjI1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbY2hlY2tlZF09XCJzdWJWLnNlbGVjdGVTdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbS5uZXdQcmljaW5nTGlzdCwgaSwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkaXNhYmxlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFfdmFsdWVcIj57e3N1YlYubmFtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3ZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3tzdWJWLmFtb3VudH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicmlnaHRfcGF5bWVudF9kZXRhaWxzIGgtMTAwXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvdGFsX3BheW1lbnRfZGV0YWlscyBoLTEwMCB3LTEwMCBwLTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGNhbGN1bGF0aW9uX3RhYmxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxjdWxhdGlvbl9zaW5nbGVfcGFydFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbF90aXRsZVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZWRlZGU7cGFkZGluZy1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgICBUb3RhbCBBY2FkZW1pYyBGZWUgQnJlYWtkb3duXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmZWVTdHJ1Y3R1cmUuZmVlQ29uZmlnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLmZlZUhlYWQgPyBpdGVtLmZlZUhlYWQubmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIiAqbmdJZj1cIml0ZW0udGVybXNMaXN0Lmxlbmd0aCA9PT0gMCB8fCBpdGVtLnNlbGVjdGVkVGVybVZhbHVlICE9ICdURVJNJ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIihpdGVtPy5jb25jZXNzaW9uICE9IG51bGwgJiYgaXRlbT8uY29uY2Vzc2lvbj8ubGVuZ3RoICE9IDApID8gJ3N0cmlrZXRocm91Z2gnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0uYW1vdW50fX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jb25jZXNzaW9uICE9IG51bGwgJiYgaXRlbT8uY29uY2Vzc2lvbi5sZW5ndGggIT0gMFwiPih7e2l0ZW0uYXBwbGllZENvbmNlc3Npb25BbW91bnR9fSk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCIgKm5nSWY9XCJpdGVtLnRlcm1zTGlzdC5sZW5ndGggPj0gMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZV90ZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGEgb2YgaXRlbS50ZXJtc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZF9zaW5nbGVfdGVybSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgKm5nSWY9XCJkYXRhLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBUZXJtIHt7ZGF0YS50ZXJtTnVtYmVyfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnRlcm1BbW91bnR9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGN1bGF0aW9uX3NpbmdsZV9wYXJ0XCIgKm5nSWY9XCJhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCAhPSBudWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsX3RpdGxlXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICAgIFRyYW5zcG9ydCBGZWVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7YWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnZlaGljbGVUeXBlID9cbiAgICAgICAgICAgICAgICBhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udmVoaWNsZVR5cGU/Lm5hbWUgOiAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50ZXJtUGF5bWVudExpc3Q/Lmxlbmd0aCA9PT0gMCB8fCBhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8uc2VsZWN0ZWRUZXJtVmFsdWUgIT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICAgICAg4oK5XG4gICAgICAgICAgICAgICAge3thZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udG90YWxBbW91bnR9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdD8ubGVuZ3RoID49IDBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVfdGVybXNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50ZXJtUGF5bWVudExpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZF9zaW5nbGVfdGVybSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBUZXJtIHt7ZGF0YS50ZXJtTnVtYmVyfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnRlcm1BbW91bnR9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGN1bGF0aW9uX3NpbmdsZV9wYXJ0XCIgKm5nSWY9XCJoYXNBY3RpdmVTdWJzY3JpcHRpb25zKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmV3X3RpdGxlIG10LTJcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGVkZWRlO3BhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgICAgU3Vic2NyaXB0aW9uc1xuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0aW5nX3NlbGVjdGVkX3N1c2NyaXB0aW9ucyBtdC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7aXRlbS5zdWJOYW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3BheW1lbnRfY2FsY3VsYXRpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbS5mcmVxdWVuY3kgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0ucHJpY2luZ1tpdGVtLmZyZXF1ZW5jeV19fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyX3NlY3Rpb24gdG90YWxfY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJfdGl0bGVcIj5HcmFuZCBUb3RhbCBGZWU8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIOKCuSB7e2ZlZVN0cnVjdHVyZT8udG90YWxGZWV9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj4iXX0=
|
437
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztBQW1CekQsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUNVLFdBQW1DLEVBQ25DLFFBQXNCO1FBRHRCLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUNuQyxhQUFRLEdB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Q1gsZUFBZSwrTEFDZixrQkFBa0IseU9BQ2xCLGVBQWUsOEJBQ2YsY0FBYyxzaUJBQ2QsaUJBQWlCLDZXQUNqQixlQUFlLDhCQUNmLHFCQUFxQix1ckJBQ3JCLGNBQWM7OzJGQUtMLHVCQUF1QjtrQkFsQm5DLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixjQUFjO3FCQUNmO29IQUtRLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7ICBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IEVsZW1lbnRTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2VkaXRvci1zZXJ2aWNlLnNlcnZpY2UnXHJcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcG8tcGF5bWVudC1kZXRhaWxzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSwgXHJcbiAgICBGb3Jtc01vZHVsZSwgXHJcbiAgICBNYXRPcHRpb25Nb2R1bGUsIFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLCBcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdFJhZGlvTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dNb2R1bGUsXHJcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BheW1lbnQtZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3BheW1lbnQtZGV0YWlscy5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUGF5bWVudERldGFpbHNDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGFkbWlzc2lvbkRhdGE6IGFueTtcclxuICBASW5wdXQoKSBzdWJzY3JpcHRpb25zRGF0YTogYW55W10gPSBbXVxyXG4gIEBJbnB1dCgpIHRlcm1QYXltZW50TGlzdDogYW55W10gPSBbXTtcclxuXHJcbiAgT2JqZWN0ID0gT2JqZWN0XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZSA6IEVsZW1lbnRTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgc25hY2tCYXIgOiBNYXRTbmFja0JhclxyXG4gICkge31cclxuXHJcbiAgZmVlU3RydWN0dXJlOiBhbnkgPSB7XHJcbiAgICBcImlkXCI6ICcxMjM0JyxcclxuICAgIFwiYnVzaW5lc3NEZXRhaWxzXCI6IHtcclxuICAgICAgXCJpZFwiOiAnMTIzNCdcclxuICAgIH0sXHJcbiAgICBcImdyYWRlc1wiOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBcIl9pZFwiOiBcIjEyMzRcIixcclxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJSVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBcIl9pZFwiOiBcIjEyMzRcIixcclxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJVlwiXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBcImJvYXJkXCI6IFwiU1RBVEVcIixcclxuICAgIFwiYWNhZGVtaWNZZWFyU3RhcnRcIjogMjAyNCxcclxuICAgIFwiYWNhZGVtaWNZZWFyRW5kXCI6IDIwMjUsXHJcbiAgICBcImZlZUNvbmZpZ3NcIjogW1xyXG4gICAgICB7XHJcbiAgICAgICAgXCJmZWVUeXBlSWRcIjogJzEyMzI0JyxcclxuICAgICAgICBcImZlZUhlYWRJZFwiOiAnMTIzNCcsXHJcbiAgICAgICAgXCJmZWVUeXBlXCI6IFwiVHV0aW9uIGZlZVwiLFxyXG4gICAgICAgIFwiZmVlSGVhZFwiOiBcImV4YW0gZmVlXCIsXHJcbiAgICAgICAgXCJhbW91bnRcIjogMzAwLFxyXG4gICAgICAgIFwiZGlzY291bnRBbW91bnRcIjogMCxcclxuICAgICAgICBcImlzRml4ZWRcIjogZmFsc2VcclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIFwic3Vic2NyaXB0aW9uUGxhbnNcIjogW10sXHJcbiAgICBcInRvdGFsQW1vdW50XCI6IDMwMCxcclxuICAgIFwiY3JlYXRlZFRpbWVzdGFtcFwiOiB7XHJcbiAgICAgIFwiJGRhdGVcIjogXCIyMDI0LTEyLTE1VDA3OjEwOjU0Ljg4OVpcIlxyXG4gICAgfSxcclxuICAgIFwidXBkYXRlZFRpbWVzdGFtcFwiOiB7XHJcbiAgICAgIFwiJGRhdGVcIjogXCIyMDI0LTEyLTE1VDA3OjEwOjU0Ljg4OVpcIlxyXG4gICAgfSxcclxuICAgIFwiYWN0aXZlXCI6IHRydWUsXHJcbiAgfVxyXG5cclxuXHJcbiAgZmVlQ29uZmlnOiBhbnk7XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMgPVtdXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnNEYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGlmKGVsZW1lbnQubmV3UHJpY2luZ0xpc3Qpe1xyXG4gICAgICAgIGVsZW1lbnQubmV3UHJpY2luZ0xpc3QuZm9yRWFjaCgoZWxlbTphbnkpID0+IHtcclxuICAgICAgICAgIGVsZW0uc2VsZWN0ZVN0YXR1cyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYWRtaXNzaW9uRGF0YT8uc3R1ZGVudEZlZVN0cnVjdHVyZVYyPy5mZWVDb25maWcuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQudGVybXNMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZighZWxlbWVudC5zZWxlY3RlZFRlcm1WYWx1ZSl7XHJcbiAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkVGVybVZhbHVlID0gJ1NJTkdMRSc7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1NJTkdMRScpIHtcclxuICAgICAgICAgICAgZWxlbWVudC50ZXJtID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucGFpZCA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LnBhaWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5wYWlkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZlZVN0cnVjdHVyZSA9IHRoaXMuYWRtaXNzaW9uRGF0YT8uc3R1ZGVudEZlZVN0cnVjdHVyZVYyO1xyXG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc0RhdGEuZm9yRWFjaChzdWIgPT4ge1xyXG4gICAgICAgIHN1Yi5uZXdQcmljaW5nTGlzdC5mb3JFYWNoKChwbDogYW55KSA9PiB7XHJcbiAgICAgICAgICBwbC5zZWxlY3RlU3RhdHVzID0gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGVsZW1lbnQuZnJlcXVlbmN5ID09PSBwbC5uYW1lO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzU3Vic2NyaXB0aW9uU2VsZWN0ZWQoc3ViKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICB0aGlzLmdldEFsbFN0b3BzKCk7XHJcbiAgICB0aGlzLmdldFZlaGljbGVUeXBlcygpO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0b3BzTGlzdDogYW55ID0gW107XHJcbiAgZmlsdGVyZWRTdG9wc0xpc3QgOiBhbnkgPSBbXTtcclxuICB2ZWhpY2xlVHlwZXNMaXN0IDogYW55ID1bXTtcclxuICBmaWx0ZXJlZFZlaGljbGVUeXBlc0xpc3Q6IGFueSA9IFtdO1xyXG5cclxuICBzdG9wU2VhcmNoVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgc2VsZWN0ZWRTdG9wOiBhbnk7XHJcbiAgc2VsZWN0ZWRWZWhpY2xlVHlwZTogYW55O1xyXG4gIHJvdXRlVmFsdWVzOiBhbnkgPSBbXTtcclxuICB2ZWhpY2xlVHlwZVNlYXJjaFRleHQ6IGFueSA9ICcnO1xyXG4gIGdldEFsbFN0b3BzKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdG9wcyh0aGlzLmFkbWlzc2lvbkRhdGE/LmJ1c2luZXNzRGV0YWlscz8uaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcHNMaXN0ID0gcmVzLmRhdGEuZGF0YVxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSBbLi4udGhpcy5zdG9wc0xpc3RdO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxyXG4gICAgICAgICAgZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOjM1MDBcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmaWx0ZXJTdG9wcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zdG9wU2VhcmNoVGV4dCkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcHNMaXN0ID0gWy4uLnRoaXMuc3RvcHNMaXN0XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnN0b3BTZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSB0aGlzLnN0b3BzTGlzdC5maWx0ZXIoKHN0b3A6YW55KSA9PlxyXG4gICAgICAgIHN0b3Auc3RvcE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdG9wU2VsZWN0aW9uKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUgPSAnJztcclxuICAgIHRoaXMudmVoaWNsZVR5cGVTZWFyY2hUZXh0ID0gJyc7XHJcbiAgICB0aGlzLnJlbW92ZVRyYXNwb3J0RmVlKCk7XHJcbiAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gbnVsbFxyXG4gICAgbGV0IHNlbGVjdGVkU3R1ZGVudDogYW55O1xyXG4gICAgdGhpcy5zdG9wc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQuc3RvcE5hbWUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnQub3B0aW9uLnZhbHVlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICBzZWxlY3RlZFN0dWRlbnQgPSBlbGVtZW50O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9wID0gZWxlbWVudDtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2VsZWN0ZWRTdG9wJyxKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkU3RvcCkpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmVoaWNsZVR5cGVzKCkge1xyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgIFwiYnVzaW5lc3NJZFwiOiB0aGlzLmFkbWlzc2lvbkRhdGEgPyB0aGlzLmFkbWlzc2lvbkRhdGEuYnVzaW5lc3NEZXRhaWxzLmlkIDogJycsXHJcbiAgICAgIFwicGFnZU5vXCI6IDAsXHJcbiAgICAgIFwicGFnZVNpemVcIjogMTAwMDAsXHJcbiAgICAgIFwiaXNQYWdpbmF0aW9uXCI6IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbFZlaGljbGVUeXBlcyhkYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6YW55KSA9PntcclxuICAgICAgICAgdGhpcy52ZWhpY2xlVHlwZXNMaXN0ID0gcmVzLmRhdGEuZGF0YVxyXG4gICAgICAgICB0aGlzLmZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdCA9IFsuLi50aGlzLnZlaGljbGVUeXBlc0xpc3RdO1xyXG4gICAgICAgICBcclxuICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdG9wID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VsZWN0ZWRTdG9wJykgfHwgJ251bGwnKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFZlaGljbGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZWxlY3RlZFZlaGljbGUnKSB8fCAnbnVsbCcpO1xyXG5cclxuICAgICAgICB0aGlzLnN0b3BTZWFyY2hUZXh0ID0gc2VsZWN0ZWRTdG9wPy5zdG9wTmFtZSB8fCAnJztcclxuICAgICAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9IHNlbGVjdGVkVmVoaWNsZT8udmVoaWNsZVR5cGUgfHwgJyc7XHJcbiAgICAgICAgaWYodGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCAhPSBudWxsKXtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9wID0gc2VsZWN0ZWRTdG9wO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlID0gc2VsZWN0ZWRWZWhpY2xlXHJcbiAgICAgICAgICB0aGlzLmdldFZlaGljbGVSb3V0ZXNCeVN0b3BzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBmaWx0ZXJlVmVoaWNsZVR5cGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdCA9IFsuLi50aGlzLnZlaGljbGVUeXBlc0xpc3RdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMudmVoaWNsZVR5cGVTZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0ID0gdGhpcy52ZWhpY2xlVHlwZXNMaXN0LmZpbHRlcigoc3RvcDphbnkpID0+XHJcbiAgICAgICAgc3RvcC52ZWhpY2xlVHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblZlaGljbGVUeXBlU2VsZWN0aW9uKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5yZW1vdmVUcmFzcG9ydEZlZSgpO1xyXG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IG51bGxcclxuICAgIHRoaXMudmVoaWNsZVR5cGVzTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC52ZWhpY2xlVHlwZS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpID09PSBldmVudC5vcHRpb24udmFsdWUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NlbGVjdGVkVmVoaWNsZScsSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlKSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFZlaGljbGVSb3V0ZXNCeVN0b3BzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRWZWhpY2xlUm91dGVzQnlTdG9wcygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0VmVoaWNsZVJvdXRlcyh0aGlzLnNlbGVjdGVkU3RvcC5pZCwgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlLnZlaGljbGVUeXBlSWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9ICdTSU5HTEUnO1xyXG4gICAgICAgICAgICBlbGVtZW50LmNoYXJnZXMuYW1vdW50ID0gZWxlbWVudC5jaGFyZ2VzLnRvdGFsQW1vdW50O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IHJlcy5kYXRhWzBdO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXMpXHJcbiAgICAgICAgICB0aGlzLnJvdXRlVmFsdWVzID0gcmVzLmRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxyXG4gICAgICAgICAgICBgJHt0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUudmVoaWNsZVR5cGV9IGRvZXNuJ3QgaGF2ZSBhbnkgcm91dGVzYCxcclxuICAgICAgICAgICAgJ09rJyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGR1cmF0aW9uOjM1MDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxyXG4gICAgICAgICAgZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOjM1MDBcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG5cclxuICBkZWZhdWx0SW1hZ2U6IHN0cmluZyA9ICdodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzkxNzA2N2MxNzM0MzM3MjgwMzAzY2FuY2VsLnBuZyc7XHJcblxyXG4gIHNlbGVjdGVkSXRlbTogYW55XHJcbiAgY2hhbmdlVGVybVZhbHVlKGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xyXG4gIFxyXG4gICAgaWYgKGl0ZW0uc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdURVJNJykge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0pOyBcclxuICAgICAgaXRlbS50ZXJtID0gdHJ1ZTtcclxuICAgICAgaXRlbS5wYWlkID0gZmFsc2U7XHJcbiAgICB9IFxyXG4gICAgXHJcbiAgICBlbHNlIHtcclxuICAgICAgaXRlbS50ZXJtID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0udGVybXNMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudCk7XHJcbiAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICBcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0pOyBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFRlcm1zKGV2OiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGV2LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCBpdGVtKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgaXRlbSlcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLnRlcm1zTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC50ZXJtSWQgPT0gaXRlbS50ZXJtSWQpIHtcclxuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JkaW5hbFN1ZmZpeChpOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaiA9IGkgJSAxMCxcclxuICAgICAgayA9IGkgJSAxMDA7XHJcbiAgICBpZiAoaiA9PSAxICYmIGsgIT0gMTEpIHtcclxuICAgICAgcmV0dXJuIGkgKyBcInN0XCI7XHJcbiAgICB9XHJcbiAgICBpZiAoaiA9PSAyICYmIGsgIT0gMTIpIHtcclxuICAgICAgcmV0dXJuIGkgKyBcIm5kXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoaiA9PSAzICYmIGsgIT0gMTMpIHtcclxuICAgICAgcmV0dXJuIGkgKyBcInJkXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaSArIFwidGhcIjtcclxuICB9XHJcblxyXG4gIGlzU3Vic2NyaXB0aW9uU2VsZWN0ZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoXHJcbiAgICAgIChwbGFuOiBhbnkpID0+IHBsYW4uc3Vic2NyaXB0aW9uSWQgPT09IGl0ZW0uc3Vic2NyaXB0aW9uSWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvblN1YnNjcmlwdGlvbkl0ZW1DaGFuZ2UoZXZlbnQ6IGFueSwgaXRlbTogYW55KSB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5jaGVja2VkO1xyXG4gIFxyXG4gICAgaWYgKGlzQ2hlY2tlZCkge1xyXG4gICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuc29tZShcclxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXHJcbiAgICAgICk7XHJcbiAgXHJcbiAgICAgIGlmICghZXhpc3RzKSB7XHJcbiAgICAgICAgaXRlbS5uZXdQcmljaW5nTGlzdC5mb3JFYWNoKChlbDphbnkpID0+IGVsLnNlbGVjdGVTdGF0dXMgPSBmYWxzZSk7XHJcbiAgICAgICAgaXRlbS5uZXdQcmljaW5nTGlzdFswXS5zZWxlY3RlU3RhdHVzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnB1c2goe1xyXG4gICAgICAgICAgc3ViSWQ6IGl0ZW0uc3Vic2NyaXB0aW9uSWQsXHJcbiAgICAgICAgICBzdWJOYW1lOiBpdGVtLnN1YnNjcmlwdGlvblRpdGxlLFxyXG4gICAgICAgICAgZnJlcXVlbmN5OiBpdGVtLm5ld1ByaWNpbmdMaXN0WzBdLm5hbWUsXHJcbiAgICAgICAgICBzdWJzY3JpcHRpb25UeXBlOiBpdGVtLnN1YnNjcmlwdGlvblR5cGUuc3Vic2NyaXB0aW9uVHlwZU5hbWUsXHJcbiAgICAgICAgICBwcmljaW5nOiBpdGVtLnByaWNpbmcsXHJcbiAgICAgICAgICBpbmNsdXNpb25zOiBpdGVtLmluY2x1c2lvbnNcclxuICAgICAgICB9KTtcclxuICBcclxuICAgICAgICBjb25zdCBhZGRBbW91bnQgPSBpdGVtLnByaWNpbmdbaXRlbS5uZXdQcmljaW5nTGlzdFswXS5uYW1lXTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgeyBhbW91bnQ6IGFkZEFtb3VudCB9KTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGNvbnN0IHJlbW92ZWRQbGFuID0gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLmZpbmQoXHJcbiAgICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxyXG4gICAgICApO1xyXG4gIFxyXG4gICAgICBpZiAocmVtb3ZlZFBsYW4pIHtcclxuICAgICAgICBjb25zdCByZW1vdmVBbW91bnQgPSBpdGVtLnByaWNpbmdbcmVtb3ZlZFBsYW4uZnJlcXVlbmN5XTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIHsgYW1vdW50OiByZW1vdmVBbW91bnQgfSk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zID0gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLmZpbHRlcihcclxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkICE9PSBpdGVtLnN1YnNjcmlwdGlvbklkXHJcbiAgICAgICk7XHJcbiAgXHJcbiAgICAgIGl0ZW0ubmV3UHJpY2luZ0xpc3QuZm9yRWFjaCgoZWw6YW55KSA9PiBlbC5zZWxlY3RlU3RhdHVzID0gZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZVN1YnNjcmlwdGlvblNlbGVjdGlvbihsaXN0OiBhbnlbXSwgc2VsZWN0ZWRJbmRleDogbnVtYmVyLCBwYXJlbnRJdGVtOiBhbnkpIHtcclxuICAgIGxldCB1bnNlbGVjdGVkSXRlbTogYW55ID0gbnVsbDtcclxuICAgIGxldCBwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCA9IGxpc3QuZmluZEluZGV4KGVsID0+IGVsLnNlbGVjdGVTdGF0dXMpO1xyXG5cclxuICAgIGlmIChwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCAhPT0gLTEgJiYgcHJldmlvdXNseVNlbGVjdGVkSW5kZXggIT09IHNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgdW5zZWxlY3RlZEl0ZW0gPSBsaXN0W3ByZXZpb3VzbHlTZWxlY3RlZEluZGV4XTtcclxuICAgIH1cclxuICAgIGxpc3QuZm9yRWFjaCgoZWwsIGluZGV4KSA9PiB7XHJcbiAgICAgIGVsLnNlbGVjdGVTdGF0dXMgPSBpbmRleCA9PT0gc2VsZWN0ZWRJbmRleDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGxpc3Rbc2VsZWN0ZWRJbmRleF07XHJcbiAgICBjb25zdCBzZWxlY3RlZFBsYW4gPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmluZChcclxuICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gcGFyZW50SXRlbS5zdWJzY3JpcHRpb25JZFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWRQbGFuKSB7XHJcbiAgICAgIHNlbGVjdGVkUGxhbi5mcmVxdWVuY3kgPSBzZWxlY3RlZEl0ZW0ubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodW5zZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgY29uc3QgcmVtb3ZlQW1vdW50ID0gcGFyZW50SXRlbS5wcmljaW5nW3Vuc2VsZWN0ZWRJdGVtLm5hbWVdO1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIHsgLi4udW5zZWxlY3RlZEl0ZW0sIGFtb3VudDogcmVtb3ZlQW1vdW50IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgY29uc3QgYWRkQW1vdW50ID0gcGFyZW50SXRlbS5wcmljaW5nW3NlbGVjdGVkSXRlbS5uYW1lXTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIHsgLi4uc2VsZWN0ZWRJdGVtLCBhbW91bnQ6IGFkZEFtb3VudCB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBoYXNBY3RpdmVTdWJzY3JpcHRpb25zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5sZW5ndGggPiAwXHJcbiAgfVxyXG5cclxuICBkaXNhYmxlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKFxyXG4gICAgICAoZWxlbTogYW55KSA9PiBlbGVtLnN1YklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWRkaW5nVHJhbnNwb3J0RmVlKCkge1xyXG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtKSB7XHJcbiAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGVsZW1lbnQpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzKVxyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVUcmFzcG9ydEZlZSgpIHtcclxuICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtKSB7XHJcbiAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm1QYXltZW50TGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBlbGVtZW50KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoZWNrYm94Q2hhbmdlKGl0ZW06IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgLy8gaWYodGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbClcclxuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcclxuICAgIGlmIChldmVudC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSBpdGVtO1xyXG4gICAgICB0aGlzLmFkZGluZ1RyYW5zcG9ydEZlZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQaWNrdXBUaW1lKGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZEl0ZW0gPSBpdGVtLmZpbmQoKGVsZW1lbnQ6YW55KSA9PiBlbGVtZW50LnN0b3AuaWQgPT09IHRoaXMuc2VsZWN0ZWRTdG9wLmlkKTtcclxuICAgIGNvbnN0IGlzb1RpbWUgPSBuZXcgRGF0ZShgMTk3MC0wMS0wMVQke21hdGNoZWRJdGVtLnBpY2t1cC5waWNrdXBUaW1lfWApO1xyXG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXREcm9wdGltZShpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gaXRlbS5maW5kKChlbGVtZW50OmFueSkgPT4gZWxlbWVudC5zdG9wLmlkID09PSB0aGlzLnNlbGVjdGVkU3RvcC5pZCk7XHJcbiAgICBjb25zdCBpc29UaW1lID0gbmV3IERhdGUoYDE5NzAtMDEtMDFUJHttYXRjaGVkSXRlbS5kcm9wLmRyb3BUaW1lfWApO1xyXG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5jaGFyZ2VzLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTScpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtLmNoYXJnZXMpXHJcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtID0gdHJ1ZTtcclxuICAgICAgaXRlbS5jaGFyZ2VzLnBhaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpdGVtLmNoYXJnZXMudGVybSA9IGZhbHNlO1xyXG4gICAgICBpdGVtLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0uY2hhcmdlcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFNpbmdsZVN0b3AoZXY6YW55LCBpdGVtOiBhbnkpIHtcclxuICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0pXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm1QYXltZW50TGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC50ZXJtSWQgPT0gaXRlbS50ZXJtSWQpIHtcclxuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoY2FsOiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybjtcclxuICBcclxuICAgIGNvbnN0IGFtb3VudCA9IHZhbHVlLmFtb3VudCA/PyB2YWx1ZS50ZXJtQW1vdW50ID8/IDA7XHJcbiAgXHJcbiAgICBpZiAoY2FsID09PSAtMSkge1xyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSAtPSBhbW91bnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSArPSBhbW91bnQ7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gPHNlY3Rpb24gY2xhc3M9XCJtYWluLXNlY3Rpb25cIj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbGVmdC1zaWRlXCI+XHJcbiAgICAgICAgQWRtaXNzaW9uIEZlZVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIiAqbmdGb3I9XCJsZXQgY29uZmlnTGlzdCBvZiBPYmplY3Qua2V5cyhmZWVDb25maWcpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItMjBcIj57e2NvbmZpZ0xpc3R9fTwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGZlZUNvbmZpZ1tjb25maWdMaXN0XVwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tjb25maWcuZmVlSGVhZH19PC9wPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e2NvbmZpZy5hbW91bnR9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIG10LTEwXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucylcIj5cclxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj57e3R5cGV9fTwvcD5cclxuXHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwic3Vic2NyaXB0aW9uLXRhYmxlIHctMTAwXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0aD5TdWJzY3JpcHRpb24gVGl0bGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+TW9udGhseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5RdWF0ZXJseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5ZZWFybHk8L3RoPlxyXG4gICAgICAgICAgICA8dGg+T24gRGVtYW5kPC90aD5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpcHRpb25zW3R5cGVdO2xldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8dGQ+e3tkYXRhLnN1Yk5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snUVVBUlRFUkxZJ11cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiICBbdmFsdWVdPVwiJ01PTlRITFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnTU9OVEhMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdNT05USExZJ1wiICBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhSYWRpb0RlZmF1bHQyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydNT05USExZJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snTU9OVEhMWSddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ1FVQVJURVJMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdRVUFSVEVSTFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnUVVBUlRFUkxZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snUVVBUlRFUkxZJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydNT05USExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydBTk5VQUxMWSddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ0FOTlVBTExZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ0FOTlVBTExZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ0FOTlVBTExZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snQU5OVUFMTFknXX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snT05ERU1BTkQnXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgW3ZhbHVlXT1cIidPTkRFTUFORCdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdPTkRFTUFORCcpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdPTkRFTUFORCdcIiBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ09OREVNQU5EJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydPTkRFTUFORCddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIj5cclxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj5QYXltZW50IFBsYW48L3A+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZy0yXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIChjbGljayk9XCJjaGFuZ2VBbm51YWxQYXltZW50VGVybSgnQU5OVUFMTFknKVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJcIiBuYW1lPVwicGF5bWVudC1wbGFuXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCIgW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdBTk5VQUxMWSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICBBbm51YWxseVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIChjbGljayk9XCJjaGFuZ2VBbm51YWxQYXltZW50VGVybSgnVEVSTScpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIlwiIG5hbWU9XCJwYXltZW50LXBsYW5cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIiBbY2hlY2tlZF09XCJhZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9PT0gJ1RFUk0nXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgVGVybVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZG1pc3Npb25cIiAqbmdJZj1cImFkbWlzc2lvbkRhdGEucGF5bWVudFBsYW5UeXBlID09PSAnVEVSTSdcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LXRleHRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cImlucHV0U3R5bGVcIiBwbGFjZWhvbGRlcj1cIi0tU2VsZWN0LS1cIiBtdWx0aXBsZT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZlZVN0cnVjdHVyZS50ZXJtUGF5bWVudExpc3RcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxjdWxhdGVUb3RhbEFtb3VudCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdGVybSBvZiB0ZXJtUGF5bWVudExpc3RcIiBbdmFsdWVdPVwidGVybVwiPnRlcm0ge3t0ZXJtLnRlcm1OdW1iZXJ9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgcmlnaHQtc2lkZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi0yMFwiPlxyXG4gICAgICAgIEZlZSBDYWxjdWxhdGlvblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LXNwYWNlIG10LTEwIG1iLTE1XCIgKm5nRm9yPVwibGV0IGNvbmZpZyBvZiBmZWVTdHJ1Y3R1cmUuZmVlQ29uZmlnc1wiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7Y29uZmlnLmZlZUhlYWR9fTwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7Y29uZmlnLmFtb3VudH19PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBzdWJzY3JpcGl0aW9uIG9mIGZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFuc1wiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7c3Vic2NyaXBpdGlvbi5zdWJOYW1lfX08L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e3N1YnNjcmlwaXRpb24ucHJpY2luZ1tzdWJzY3JpcGl0aW9uLmZyZXF1ZW5jeV19fTwvcD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG90YWwtZmVlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItNVwiPlxyXG4gICAgICAgICAgVG90YWwgRmVlXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFtb3VudFwiPlxyXG4gICAgICAgICAg4oK5IHt7ZmVlU3RydWN0dXJlLnRvdGFsQW1vdW50fX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPiAtLT5cclxuXHJcblxyXG48c2VjdGlvbiBjbGFzcz1cIm1haW5fcGF5bWVudF9kZXRhaWxzX3NlY3Rpb24gaC0xMDAgdy0xMDAgcC0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gIDxkaXYgY2xhc3M9XCJsZWZ0X3BheW1lbnRfZGV0YWlscyBoLTEwMCBwLTJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmZWVzX3NlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNlY190aXRsZVwiPlxyXG4gICAgICAgIEZlZXNcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGFsbF9mZWVfY29uZmlnc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmVlU3RydWN0dXJlPy5mZWVDb25maWdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfZmVlX2NvbmZpZyBwLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLmZlZUhlYWQgPyBpdGVtLmZlZUhlYWQubmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX2Ftb3VudFwiPuKCuSB7e2l0ZW0uYW1vdW50fX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnRlcm1zTGlzdC5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYW5nZV9zZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBbKG5nTW9kZWwpXT1cIml0ZW0uc2VsZWN0ZWRUZXJtVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgbmFtZT1cInRlcm1PcHRpb25fe3sgaXRlbS5mZWVIZWFkLmlkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVRlcm1WYWx1ZShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlNJTkdMRVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7Zm9udC1zaXplOjEzcHhcIj5TaW5nbGU8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiVEVSTVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7Zm9udC1zaXplOjEzcHhcIj5UZXJtPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRlcm1Db3VudFwiICpuZ0lmPVwiaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tfZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGl0ZW0udGVybXNMaXN0O2xldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlRGF0YSBkLWZsZXggZ2FwLTMgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJhZGRUZXJtcygkZXZlbnQsdGVybSlcIiBbY2hlY2tlZF09XCJ0ZXJtLnNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YV92YWx1ZVwiPnt7Z2V0T3JkaW5hbFN1ZmZpeChpKzEpfX0gVGVybSAo4oK5IHt7dGVybT8udGVybUFtb3VudH19KTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbnNfbGlzdCBtdC0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlRyYW5zcG9ydCBGZWU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RpbmdfdHlwZXMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDozMCVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlucHV0X2NhcmQgbXQtMiB3LTEwMFwiIHN0eWxlPVwiaGVpZ2h0OjQwcHhcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0b3BcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9HcmFkZVwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcFNlYXJjaFRleHRcIiAoaW5wdXQpPVwiZmlsdGVyU3RvcHMoKVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvR3JhZGU9XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib25TdG9wU2VsZWN0aW9uKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0b3Agb2YgZmlsdGVyZWRTdG9wc0xpc3RcIiBbdmFsdWVdPVwic3RvcC5zdG9wTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHN0b3Auc3RvcE5hbWUgfCB0aXRsZWNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6MzAlXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbnB1dF9jYXJkIG10LTIgdy0xMDBcIiBzdHlsZT1cImhlaWdodDo0MHB4XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBWZWhpY2xlIFR5cGVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9HcmFkZTFcIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZlaGljbGVUeXBlU2VhcmNoVGV4dFwiIChpbnB1dCk9XCJmaWx0ZXJlVmVoaWNsZVR5cGVzKClcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTNweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0b0dyYWRlMT1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblZlaGljbGVUeXBlU2VsZWN0aW9uKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0b3Agb2YgZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0XCIgW3ZhbHVlXT1cInN0b3AudmVoaWNsZVR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBzdG9wLnZlaGljbGVUeXBlIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X2FsbF9zdWJzY3JpcHRpb25zIG10LTJcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm91dGVWYWx1ZXNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9mZWVfY29uZmlnIHAtM1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID09PSBpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKGl0ZW0sICRldmVudClcIj48L21hdC1jaGVja2JveD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwid2lkdGg6OTIlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnRyYW5zcG9ydC5yb3V0ZSA/IGl0ZW0udHJhbnNwb3J0LnJvdXRlLm5hbWUgOiAnTi9BJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPig8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5QaWNrdXAgVGltZSA6PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1zZW1pLWJvbGQtZm9udC1mYW1pbHkpO1wiPnt7Z2V0UGlja3VwVGltZShpdGVtLnRyYW5zcG9ydC5idXNSb3V0ZVN0b3BUaW1pbmdzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGU6J2g6bW0gYSd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIC1cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPkRyb3AgVGltZSA6PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1zZW1pLWJvbGQtZm9udC1mYW1pbHkpO1wiPnt7Z2V0RHJvcHRpbWUoaXRlbS50cmFuc3BvcnQuYnVzUm91dGVTdG9wVGltaW5ncylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlOidoOm1tIGEnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICApPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIj7igrkge3sgaXRlbS5jaGFyZ2VzLnRvdGFsQW1vdW50IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmNoYXJnZXMudGVybVBheW1lbnRMaXN0Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFuZ2Vfc2VsZWN0aW9uXCIgc3R5bGU9XCJ3aWR0aDo5MCU7bWFyZ2luOjAgYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJTZWxlY3QgYW4gb3B0aW9uXCIgWyhuZ01vZGVsKV09XCJpdGVtLmNoYXJnZXMuc2VsZWN0ZWRUZXJtVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlVHJhbnNwb3J0VGVybVZhbHVlKGl0ZW0pXCIgW2Rpc2FibGVkXT1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9PSBpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJTSU5HTEVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7IGZvbnQtc2l6ZTogMTNweFwiPlNpbmdsZTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlRFUk1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7IGZvbnQtc2l6ZTogMTNweFwiPlRlcm08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRlcm1Db3VudFwiICpuZ0lmPVwiaXRlbS5jaGFyZ2VzLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrX2RhdGFcIiBzdHlsZT1cIndpZHRoOjc1JTttYXJnaW46MCBhdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBpdGVtLmNoYXJnZXMudGVybVBheW1lbnRMaXN0OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlRGF0YSBkLWZsZXggZ2FwLTMgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cImFkZFNpbmdsZVN0b3AoJGV2ZW50LCB0ZXJtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9PSBpdGVtXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFfdmFsdWVcIj57eyBnZXRPcmRpbmFsU3VmZml4KGkgKyAxKSB9fSBUZXJtICjigrkge3t0ZXJtLnRlcm1BbW91bnR9fSk8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25zX2xpc3QgbXQtM1wiICpuZ0lmPVwic3Vic2NyaXB0aW9uc0RhdGEubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlN1YnNjcmlwdGlvbnM8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9hbGxfc3Vic2NyaXB0aW9ucyBtdC0yXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN1YnNjcmlwdGlvbnNEYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BfMVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImlzU3Vic2NyaXB0aW9uU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU3Vic2NyaXB0aW9uSXRlbUNoYW5nZSgkZXZlbnQsIGl0ZW0pXCI+PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uX3RpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7aXRlbS5zdWJzY3JpcHRpb25UaXRsZX19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uX3R5cGVzXCIgc3R5bGU9XCJ3aWR0aDo4NSU7bWFyZ2luOmF1dG9cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YlYgb2YgaXRlbS5uZXdQcmljaW5nTGlzdDtsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfc3Vic2NycHRpb24gZC1mbGV4IGdhcC0yIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3RpdGxlIGQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOjI1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFtjaGVja2VkXT1cInN1YlYuc2VsZWN0ZVN0YXR1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGl0ZW0ubmV3UHJpY2luZ0xpc3QsIGksIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkaXNhYmxlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YV92YWx1ZVwiPnt7c3ViVi5uYW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3ZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e3N1YlYuYW1vdW50fX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwicmlnaHRfcGF5bWVudF9kZXRhaWxzIGgtMTAwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidG90YWxfcGF5bWVudF9kZXRhaWxzIGgtMTAwIHctMTAwIHAtM1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMiBjYWxjdWxhdGlvbl90YWJsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxjdWxhdGlvbl9zaW5nbGVfcGFydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsX3RpdGxlXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cclxuICAgICAgICAgICAgVG90YWwgQWNhZGVtaWMgRmVlIEJyZWFrZG93blxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZlZVN0cnVjdHVyZS5mZWVDb25maWdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLmZlZUhlYWQgPyBpdGVtLmZlZUhlYWQubmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX2Ftb3VudFwiICpuZ0lmPVwiaXRlbS50ZXJtc0xpc3QubGVuZ3RoID09PSAwIHx8IGl0ZW0uc2VsZWN0ZWRUZXJtVmFsdWUgIT0gJ1RFUk0nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCIoaXRlbT8uY29uY2Vzc2lvbiAhPSBudWxsICYmIGl0ZW0/LmNvbmNlc3Npb24/Lmxlbmd0aCAhPSAwKSA/ICdzdHJpa2V0aHJvdWdoJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0uYW1vdW50fX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jb25jZXNzaW9uICE9IG51bGwgJiYgaXRlbT8uY29uY2Vzc2lvbi5sZW5ndGggIT0gMFwiPih7e2l0ZW0uYXBwbGllZENvbmNlc3Npb25BbW91bnR9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCIgKm5nSWY9XCJpdGVtLnRlcm1zTGlzdC5sZW5ndGggPj0gMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlX3Rlcm1zXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGl0ZW0udGVybXNMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZF9zaW5nbGVfdGVybSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgKm5nSWY9XCJkYXRhLnNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgVGVybSB7e2RhdGEudGVybU51bWJlcn19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS50ZXJtQW1vdW50fX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsY3VsYXRpb25fc2luZ2xlX3BhcnRcIiAqbmdJZj1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9IG51bGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbF90aXRsZVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZWRlZGU7cGFkZGluZy1ib3R0b206IDEycHg7XCI+XHJcbiAgICAgICAgICAgIFRyYW5zcG9ydCBGZWVcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3thZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udmVoaWNsZVR5cGUgP1xyXG4gICAgICAgICAgICAgICAgYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnZlaGljbGVUeXBlPy5uYW1lIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdD8ubGVuZ3RoID09PSAwIHx8IGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy5zZWxlY3RlZFRlcm1WYWx1ZSAhPSAnVEVSTSdcIj5cclxuICAgICAgICAgICAgICAgIOKCuVxyXG4gICAgICAgICAgICAgICAge3thZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udG90YWxBbW91bnR9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdD8ubGVuZ3RoID49IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZV90ZXJtc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udGVybVBheW1lbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZF9zaW5nbGVfdGVybSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGEuc2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBUZXJtIHt7ZGF0YS50ZXJtTnVtYmVyfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnRlcm1BbW91bnR9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxjdWxhdGlvbl9zaW5nbGVfcGFydFwiICpuZ0lmPVwiaGFzQWN0aXZlU3Vic2NyaXB0aW9ucygpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmV3X3RpdGxlIG10LTJcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGVkZWRlO3BhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxyXG4gICAgICAgICAgICBTdWJzY3JpcHRpb25zXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0aW5nX3NlbGVjdGVkX3N1c2NyaXB0aW9ucyBtdC0yXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFuc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj57e2l0ZW0uc3ViTmFtZSB8IHRpdGxlY2FzZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfcGF5bWVudF9jYWxjdWxhdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbS5mcmVxdWVuY3kgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0ucHJpY2luZ1tpdGVtLmZyZXF1ZW5jeV19fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlcl9zZWN0aW9uIHRvdGFsX2NvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJfdGl0bGVcIj5HcmFuZCBUb3RhbCBGZWU8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICDigrkge3tmZWVTdHJ1Y3R1cmU/LnRvdGFsRmVlfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPiJdfQ==
|