simpo-component-library 3.6.130 → 3.6.132
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/components/trasport-availability/trasport-availability.component.mjs +4 -4
- package/esm2022/lib/constants/business.constant.mjs +1 -1
- package/esm2022/lib/directive/alignment.directive.mjs +4 -4
- package/esm2022/lib/directive/animation-directive.mjs +4 -4
- package/esm2022/lib/directive/background-directive.mjs +5 -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 +28 -29
- package/esm2022/lib/directive/button-editor.directive.mjs +6 -6
- 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/height.directive.mjs +4 -4
- package/esm2022/lib/directive/hover-animation.directive.mjs +4 -5
- 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/set-dynamic-background.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/spacing.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/translate-onhover.directive.mjs +4 -4
- package/esm2022/lib/directive/wrap-containers.directive.mjs +4 -4
- package/esm2022/lib/ecommerce/sections/address/address.component.mjs +6 -6
- package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +59 -8
- 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 +15 -7
- 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/new-collection/new-collection.component.mjs +5 -7
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +7 -6
- 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 +27 -8
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +16 -18
- 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/store-list/store-list.component.mjs +8 -5
- package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +12 -12
- package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +7 -6
- 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 -6
- package/esm2022/lib/elements/address-list/address-list.component.mjs +5 -5
- package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +6 -14
- 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 -6
- package/esm2022/lib/elements/index.mjs +5 -5
- package/esm2022/lib/elements/link-editor/link-editor.component.mjs +12 -23
- package/esm2022/lib/elements/media-selector/media-selector.component.mjs +5 -7
- package/esm2022/lib/elements/navbar-button-element/navbar-button-element.component.mjs +4 -5
- package/esm2022/lib/elements/portfolio/portfolio.component.mjs +5 -5
- package/esm2022/lib/elements/pricing-s1/pricing-s1.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 +22 -5
- package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +5 -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 +155 -96
- package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
- package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +5 -30
- 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 -6
- package/esm2022/lib/sections/banner-section/banner-section.component.mjs +4 -5
- package/esm2022/lib/sections/blog-list/blog-list.component.mjs +5 -5
- 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 -8
- 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 +5 -5
- 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 -22
- 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 +5 -5
- package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
- 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 -6
- package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
- package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +5 -5
- package/esm2022/lib/sections/news-letter-component/news-letter.modal.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 -38
- package/esm2022/lib/services/endUser.service.mjs +4 -4
- package/esm2022/lib/services/events.service.mjs +4 -11
- package/esm2022/lib/services/image-upload-service.service.mjs +4 -4
- package/esm2022/lib/services/rest.service.mjs +12 -50
- package/esm2022/lib/services/sanitizeHtml.mjs +4 -4
- package/esm2022/lib/services/storage.service.mjs +4 -45
- package/esm2022/lib/styles/index.mjs +1 -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 +1 -1
- package/fesm2022/simpo-component-library.mjs +900 -992
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/directive/background-directive.d.ts +1 -1
- package/lib/directive/button-directive.directive.d.ts +1 -1
- package/lib/directive/color.directive.d.ts +1 -1
- package/lib/ecommerce/sections/authentication-required/authentication-required.component.d.ts +12 -2
- package/lib/ecommerce/sections/featured-products/featured-products.component.d.ts +2 -0
- package/lib/ecommerce/sections/new-collection/new-collection.component.d.ts +1 -1
- package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +1 -1
- package/lib/ecommerce/sections/product-list/product-list.component.d.ts +2 -2
- package/lib/ecommerce/sections/store-list/store-list.component.d.ts +3 -1
- package/lib/ecommerce/sections/store-page/store-page.component.d.ts +2 -2
- package/lib/elements/text-editor/text-editor.component.d.ts +2 -0
- package/lib/sections/appointment-form/appointment-form.component.d.ts +11 -4
- package/lib/sections/banner-grid-section/banner-grid-section.component.d.ts +1 -1
- package/lib/sections/contact-us/contact-us.component.d.ts +1 -1
- package/lib/sections/header-section/header-section.component.d.ts +1 -1
- package/lib/sections/moving-text/moving-text.component.d.ts +1 -1
- package/lib/sections/pricing-section/pricing-section.component.d.ts +1 -1
- package/lib/services/cart.service.d.ts +0 -6
- package/lib/services/events.service.d.ts +0 -6
- package/lib/services/rest.service.d.ts +0 -14
- package/lib/services/storage.service.d.ts +0 -6
- package/lib/styles/style.model.d.ts +5 -0
- package/package.json +1 -1
- package/simpo-component-library-3.6.132.tgz +0 -0
- package/src/lib/styles/global-styles.css +242 -242
- package/simpo-component-library-3.6.130.tgz +0 -0
@@ -93,12 +93,14 @@ export class ProductDescComponent extends BaseSection {
|
|
93
93
|
mobileNumber: "",
|
94
94
|
pincode: "",
|
95
95
|
username: "",
|
96
|
-
|
96
|
+
email: "",
|
97
|
+
message: ``,
|
97
98
|
};
|
98
99
|
this.validationErrors = {
|
99
100
|
username: false,
|
100
101
|
mobileNumber: false,
|
101
|
-
pincode: false
|
102
|
+
pincode: false,
|
103
|
+
email: false
|
102
104
|
};
|
103
105
|
this.isSubmitting = false;
|
104
106
|
this.scheduled = false;
|
@@ -538,6 +540,7 @@ export class ProductDescComponent extends BaseSection {
|
|
538
540
|
}
|
539
541
|
}
|
540
542
|
getTextColor(color) {
|
543
|
+
debugger;
|
541
544
|
const threshold = 130;
|
542
545
|
const r = parseInt(color.slice(1, 3), 16);
|
543
546
|
const g = parseInt(color.slice(3, 5), 16);
|
@@ -604,6 +607,14 @@ export class ProductDescComponent extends BaseSection {
|
|
604
607
|
this.validationErrors.pincode = true;
|
605
608
|
hasErrors = true;
|
606
609
|
}
|
610
|
+
if (!this.videoCallPayload.email?.trim()) {
|
611
|
+
this.validationErrors.email = true;
|
612
|
+
hasErrors = true;
|
613
|
+
}
|
614
|
+
else if (!/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(this.videoCallPayload.email)) {
|
615
|
+
this.validationErrors.email = true;
|
616
|
+
hasErrors = true;
|
617
|
+
}
|
607
618
|
if (hasErrors) {
|
608
619
|
if (!this.videoCallPayload.username?.trim() || !this.videoCallPayload.mobileNumber || !this.videoCallPayload.pincode) {
|
609
620
|
this.messageService.add({
|
@@ -629,10 +640,18 @@ export class ProductDescComponent extends BaseSection {
|
|
629
640
|
key: 'Video Call Schedule'
|
630
641
|
});
|
631
642
|
}
|
643
|
+
else if (!this.videoCallPayload.email?.trim() || !/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(this.videoCallPayload.email)) {
|
644
|
+
this.messageService.add({
|
645
|
+
severity: 'warn',
|
646
|
+
summary: 'Video Call Schedule',
|
647
|
+
detail: 'Please enter a valid email address',
|
648
|
+
key: 'Video Call Schedule'
|
649
|
+
});
|
650
|
+
}
|
632
651
|
return;
|
633
652
|
}
|
634
653
|
this.isSubmitting = true;
|
635
|
-
this.videoCallPayload.message = this.videoCallPayload.message + `in ${this.selectedLang == 'Others' ? this.otherLanguage : this.selectedLang} language`;
|
654
|
+
this.videoCallPayload.message = this.videoCallPayload.message + `Hi, I've just scheduled a video call with you for this product ${this.responseData?.name}. It's important and I'd appreciate your time — looking forward to connecting as soon as possible in ${this.selectedLang == 'Others' ? this.otherLanguage : this.selectedLang} language`;
|
636
655
|
this.restService.postVideoCallDetails(this.videoCallPayload).subscribe((res) => {
|
637
656
|
this.messageService.add({
|
638
657
|
severity: 'success',
|
@@ -717,10 +736,10 @@ export class ProductDescComponent extends BaseSection {
|
|
717
736
|
return noofratings;
|
718
737
|
}
|
719
738
|
}
|
720
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
721
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }, { propertyName: "d2", first: true, predicate: ["d2"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\r\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div>\r\n <section class=\"container p-0\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\r\n <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div>\r\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\"\r\n [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\r\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\r\n <div class=\"prod-img-block\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-4 col-12 h-100 product-detail\" #d2>\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <div class=\"product-sku\">\r\n <!-- <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div> -->\r\n <div\r\n *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">\r\n Category : <a href=\"javascript:void(0)\" (click)=\"goToFilter(cat.refName)\"\r\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\r\n titlecase}} <ng-container\r\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\r\n </a></div>\r\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\r\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\r\n </span></div>\r\n </div>\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\r\n </div>\r\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\r\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <div class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">Out of\r\n Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\" simpoButtonDirective\r\n [id]=\"buttonId\" [buttonStyle]=\"button?.styles\" [backgroundInfo]=\"styles?.background\"\r\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"opendailogbox(dialogBox)\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addToCart()\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div class=\"favourite border-solid\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-product\">\r\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-15\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\" [style.color]=\"data?.styles?.background?.accentColor\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-600\" [style.color]=\"data?.styles?.background?.accentColor\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"d-flex flex-column\" style=\"margin-top: 15px;\"\r\n *ngIf=\"responseData?.averageRating && responseData?.totalReviewCount\">\r\n <div class=\"rating d-flex justify-content-center gap-2\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"rating-no my-1\">{{\"\u2B50\" + (responseData?.averageRating | number:'1.1-2')}}</div>\r\n <div class=\"total-ratings my-1\">{{responseData?.totalReviewCount == 1 ? '1 Rating' :\r\n getRatings(responseData?.totalReviewCount) + \" \" + \"ratings\"}}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\" [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\">\r\n <span [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n </div>\r\n <div class=\"tax-text\">(MRP Inclusive all taxes)</div>\r\n </div>\r\n <div class=\"heading-large trim-text\" class=\"product-heading\">{{responseData?.name}}</div>\r\n <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc\">\r\n <div>\r\n <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n + PRICE BREAKUP\r\n </div>\r\n </div>\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\" [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\"\r\n [style.color]=\"ele.materialType == 'DIAMOND' ? '#fff' : ''\">\r\n {{ele.materialType | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6\">\r\n <div class=\"row-header\">\r\n Net Weight/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.primaryMaterialWeight + \" \" + 'grams'}}\r\n </div>\r\n </div>\r\n <div class=\"col-6\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.materialPurity}}\r\n </div>\r\n </div>\r\n <!-- <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Price/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\r\n Making Charges\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Net Weight\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.baseWeight}} </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Making Charge %\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.makingChargePercentage}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"tab-group\">\r\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style1'\">\r\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </ng-container>\r\n </div>\r\n <div class=\"item-img\" (wheel)=\"scroll($event)\">\r\n <ng-container *ngIf=\"currentImg\">\r\n\r\n <!-- <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon> -->\r\n <ng-container *ngIf=\"!isMobile\">\r\n <img [src]=\"currentImg\" class=\"img zoom\" style=\"height: 100%; width: 100%;\" [simpoCorner]=\"styles?.corners\">\r\n </ng-container>\r\n <ng-container *ngIf=\"isMobile\">\r\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\" [simpoCorner]=\"styles?.corners\" class=\"zoom\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!currentImg\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n [simpoCorner]=\"styles?.corners\">\r\n </ng-container>\r\n </div>\r\n <div class=\"img-list w-100\" *ngIf=\"screenWidth <= 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img zoom\" (click)=\"changeImg(img.imgUrl)\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style2'\">\r\n <div class=\"row h-100 overflow-scroll mt-0 w-100\">\r\n <ng-container *ngIf=\"itemImages?.length == 0\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\" class=\"img\"\r\n [simpoCorner]=\"styles?.corners\" class=\"col-12 h-100 p-0\">\r\n </ng-container>\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img col-6 h-75 p-1\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\"\r\n [class.h-100]=\"screenWidth <= 500\" [class.w-100]=\"itemImages?.length == 1\"\r\n [class.h-100]=\"itemImages?.length == 1\">\r\n </ng-container>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 br-50\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"col-4\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/275354c1750835096471Animation - 1750835001220.gif\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"col-8 align-content-center\" [style.color]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <div class=\"sch-btn text-center cursor-pointer\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"opendailogbox(dialogBox)\">\r\n Schedule a Video Call\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\" [style.color]=\"data?.styles?.background?.accentColor\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\">\r\n <div class=\"d-flex align-items-center w-90\">\r\n <div class=\"d-flex mx-1\"><mat-icon [style.color]=\"data?.styles?.background?.accentColor\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input\" placeholder=\"Pin Code\" [(ngModel)]=\"pincode\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"isDetails\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon\">\uD83C\uDF81</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Free\r\n Delivery by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n Order will\r\n Deliver by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Nearest Store Section -->\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-start store-item\">\r\n <span class=\"store-icon\">\uD83C\uDFEA</span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.name | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.storeId)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Try At Home Section -->\r\n <!-- <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon\">\uD83C\uDFE0</span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\">BOOK HOME APPOINTMENT</button>\r\n </div>\r\n </div> -->\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"><span [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-15\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n\r\n <div class=\"schedule-header w-100 d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"closeDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n\r\n <div class=\"modal-body h-100 p-0\">\r\n\r\n <div class=\"row h-100 w-100 mt-3\">\r\n <div class=\"col-6\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/603782c1750925995765Animation - 1750925947618.gif\"\r\n alt=\"\" class=\"h-100 w-100\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100\">\r\n\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n <!-- Pincode Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div>\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\r\n [disabled]=\"isSubmitting\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <mat-icon>video_call</mat-icon> \r\n SCHEDULE A VIDEO CALL\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon> \r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-10-20\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3\">COMPONENT</div>\r\n <div class=\"col-3\">RATE</div>\r\n <div class=\"col-3\">WEIGHT</div>\r\n <div class=\"col-3\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3\">{{ ele.materialPurity | titlecase }}</div>\r\n <div class=\"col-3\">\u20B9{{ getPricePerGram(ele.primaryMaterialWeight, ele.materialPrice) | number:'1.2-2' }}</div>\r\n <div class=\"col-3\">{{ ele.primaryMaterialWeight + \" grams\" }}</div>\r\n <div class=\"col-3 total\">\u20B9{{ ele.materialPrice | number:'1.2-2' }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>", styles: [".product-desc{display:flex}*{font-family:Mulish!important}mat-icon{font-family:Material Icons!important}.strike-through{text-decoration:line-through;color:#d3d3d3}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon{border:1px solid;border-radius:8px;padding:5px;height:43px;width:40px;display:flex;align-items:center;justify-content:center;font-size:18px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.header-text{font-size:22px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:2%;border-radius:8px}.img-list{display:flex;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-size:32px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.product-detail{overflow-y:scroll}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:75%}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:20px;font-weight:600}.prod-img-block{height:100%;display:flex;flex-direction:column-reverse;justify-content:start;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc,.brief-desc{font-size:16px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0;min-height:95vh!important;height:unset!important}.product-heading{font-size:16px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;text-transform:uppercase}.favourite .mat-icon{min-height:40px;min-width:40px;font-size:25px;display:flex;align-items:center;justify-content:center;border-radius:5px;cursor:pointer}.border-solid{border:1px solid;border-radius:8px}a{text-decoration:none}.body-large{color:#848484}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}.mb-15{margin-bottom:15px}@media (min-width: 1400px){.container{max-width:1500px;width:100%}}.width-max{width:max-content}.width-34{width:33.3%!important}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.f-18{font-size:18px}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px}.varient-value{font-size:16px}.custom-text{border-radius:0 8px 8px 0}.br-50{border-radius:50%}.w-15{width:22%!important}.scroll-wrap{overflow:scroll;flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid;margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:13px}.sch-btn{width:100%;color:#fff;padding:10px 0;margin-top:5px;border-radius:12px;font-size:18px}.tax-text{font-size:12px}.modal-dialog{position:absolute!important;top:15%!important;left:30%!important;width:53%!important;height:75vh!important;max-width:unset!important;background:#fff;border-radius:18px!important}.schedule-header{border-radius:18px 18px 0 0}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:15px 0;background-color:transparent}.delivery-title{font-size:22px;font-weight:600;margin:0 0 12px;line-height:1.2}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:12px 10px;margin-bottom:15px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:16px;font-weight:600;color:#374151;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{color:#9ca3af;font-weight:500}.locate-btn{background:none!important;border:none!important;color:#6b7280!important;font-weight:500;font-size:15px!important;padding:0!important;box-shadow:none!important;width:20%!important}.locate-btn:hover{color:#374151!important}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid #cfcfcf;padding:12px 8px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:16px;font-weight:700}.store-section{border:1px solid #cfcfcf;padding:12px 2px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:20px;padding-left:8px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:16px;margin-bottom:8px;line-height:1.4}.store-label{color:#374151}.store-name{font-weight:700;color:#374151}.store-distance{color:#6b7280}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:95%!important;padding:8px 20px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:12px;border:1px solid #cfcfcf}.try-home-item{margin-bottom:20px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-header{margin-bottom:4px;line-height:1.4}.try-home-text{font-size:16px;font-weight:700;color:#374151}.free-text{font-size:16px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:linear-gradient(135deg,#8b5cf6,#a855f7);color:#fff;border:none;padding:8px 20px;border-radius:12px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease}.book-appointment-btn:hover{background:linear-gradient(135deg,#7c3aed,#9333ea);transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}@media (max-width: 480px){.delivery-container{padding:12px}.location-section{padding:12px 20px}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.border-unset{border:unset!important}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:15%;width:35%}.rating{width:max-content;border:1px solid;border-radius:50px;padding:2px}.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.rating-no{padding-right:12px;margin:2px 0;border-right:1px solid}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.me-2{margin-right:.5rem}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i10.DecimalPipe, name: "number" }, { kind: "pipe", type: i10.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i10.DatePipe, name: "date" }, { kind: "pipe", type: i10.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i11.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: i11.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i12.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i13.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i14.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "edit", "customClass", "delete", "nextComponentColor"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId", "iconColor"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i15.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "component", type: i16.SpeedDial, selector: "p-speedDial", inputs: ["id", "model", "visible", "style", "className", "direction", "transitionDelay", "type", "radius", "mask", "disabled", "hideOnClickOutside", "buttonStyle", "buttonClassName", "maskStyle", "maskClassName", "showIcon", "hideIcon", "rotateAnimation", "ariaLabel", "ariaLabelledBy"], outputs: ["onVisibleChange", "visibleChange", "onClick", "onShow", "onHide"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i17.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: SvgDividerComponent, selector: "simpo-svg-divider", inputs: ["dividerType", "color"] }, { kind: "directive", type: CornerDirective, selector: "[simpoCorner]", inputs: ["simpoCorner"] }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId"] }] }); }
|
739
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductDescComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.RestService }, { token: i4.CartService }, { token: i5.StorageServiceService }, { token: i6.MessageService }, { token: i7.Meta }, { token: i7.Title }, { token: i8.MatBottomSheet }, { token: i0.Renderer2 }, { token: i9.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
740
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }, { propertyName: "d2", first: true, predicate: ["d2"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\n\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\n </div>\n <section class=\"container p-0\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\n <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\n (click)=\"routeToHome()\">Home</a> /\n <span>{{ responseData?.name | titlecase }}</span>\n </div>\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\"\n [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\n <div class=\"prod-img-block\">\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\n </div>\n </div>\n <div class=\"col-lg-4 col-12 h-100 product-detail\" #d2>\n <ng-container *ngIf=\"isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\n\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\n </ng-container>\n\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\n </ng-container>\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\n </ng-container>\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\n </ng-container>\n\n\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\n </ng-container>\n\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\n [innerHTML]=\"responseData.brief\"></div> -->\n <div class=\"product-sku\">\n <!-- <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div> -->\n <div\n *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">\n Category : <a href=\"javascript:void(0)\" (click)=\"goToFilter(cat.refName)\"\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\n titlecase}} <ng-container\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\n </a></div>\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\n </span></div>\n </div>\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\n <!-- <ng-container>\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\n </ng-container> -->\n </div>\n </div>\n </section>\n <ng-container *ngIf=\"relatedProductData?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\n </ng-container>\n <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\"></simpo-featured-products>\n </ng-container>\n <!-- <ng-container>\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\n </ng-container> -->\n\n <ng-container *ngIf=\"styles?.devider?.display\">\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\n </ng-container>\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n\n<div class=\"mobile-footer\">\n <div class=\"icons\">\n <div (click)=\"goToCart()\">\n <mat-icon>shopping_cart</mat-icon>\n </div>\n <div>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n </div>\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\n </div>\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\n</div>\n\n<ng-template #ReviewSection>\n <div class=\"review-sec\">\n <div class=\"title\">Customer Review</div>\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\n <span>Be the first to write a review</span>\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\n Review' : 'Cancel Review'}}</button>\n <ng-container *ngIf=\"showReview\">\n <hr />\n <div class=\"user-review\">\n <div class=\"title\">Write a review</div>\n <span class=\"secondary-text\">RATING</span>\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\n <div>\n <span class=\"secondary-text\">Review Title</span>\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\n </div>\n <div>\n <span class=\"secondary-text\">Review</span>\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\n </div>\n <div class=\"review-action-btn\">\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n (click)=\"addProductReview()\"\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\n review</button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #SocialIcons>\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\n <div style=\"position: relative;margin-right: 10px;\">\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\n [sectionId]=\"data?.id\"></simpo-socia-icons>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #ActionBtn>\n <div class=\"button-parent\">\n <div class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\"\n [style.color]=\"data?.styles?.background?.accentColor\">Out of\n Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\n </div>\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? opendailogbox(dialogBox) : ''\">\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n <div class=\"favourite border-solid\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n <div class=\"share-product\">\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\" [style.color]=\"data?.styles?.background?.accentColor\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">share</mat-icon>\n </div>\n </div>\n</ng-template>\n\n<ng-template #variants>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"mb-15\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\n <ng-container>\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"variant-head\" [style.color]=\"data?.styles?.background?.accentColor\">{{item.key | titlecase}}</div>\n <div class=\"variant-value text-start fw-600\" [style.color]=\"data?.styles?.background?.accentColor\">\n {{item.value |\n titlecase}}</div>\n </div>\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #ProductDesc>\n <div class=\"d-flex flex-column\" style=\"margin-top: 15px;\"\n *ngIf=\"responseData?.averageRating && responseData?.totalReviewCount\">\n <div class=\"rating d-flex justify-content-center gap-2\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"rating-no my-1\">{{\"\u2B50\" + (responseData?.averageRating | number:'1.1-2')}}</div>\n <div class=\"total-ratings my-1\">{{responseData?.totalReviewCount == 1 ? '1 Rating' :\n getRatings(responseData?.totalReviewCount) + \" \" + \"ratings\"}}</div>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"price\" [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\">\n <span [innerHTML]='currency'></span>\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}\n </div>\n </div>\n <div class=\"tax-text\">(MRP Inclusive all taxes)</div>\n </div>\n <div class=\"heading-large trim-text\" class=\"product-heading\">{{responseData?.name}}</div>\n <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\n\n</ng-template>\n\n<ng-template #descriptors>\n <div class=\"row prod-desc\">\n <div>\n <div class=\"product-header d-flex align-items-center justify-content-between\">\n <span class=\"header-text\"\n *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n + PRICE BREAKUP\n </div>\n </div>\n <div class=\"description\">\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name\" [style.background]=\"data?.styles?.background?.color\"></div>\n </div>\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\n <div class=\"jewellery-table-container\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"jewel-container mt-2\">\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\"\n [style.color]=\"ele.materialType == 'DIAMOND' ? '#fff' : ''\">\n {{ele.materialType | titlecase}}\n </div>\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\n <div class=\"col-6\">\n <div class=\"row-header\">\n Net Weight/Gram\n </div>\n <div class=\"row-content\">\n {{ele.primaryMaterialWeight + \" \" + 'grams'}}\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row-header\">\n Purity\n </div>\n <div class=\"row-content\">\n {{ele.materialPurity}}\n </div>\n </div>\n <!-- <div class=\"col-4\">\n <div class=\"row-header\">\n Price/Gram\n </div>\n <div class=\"row-content\">\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\n number:'1.2-2'}}\n </div>\n </div>\n <div class=\"col-4\">\n <div class=\"row-header\">\n Value\n </div>\n <div class=\"row-content\">\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\n </div>\n </div> -->\n </div>\n </div>\n </ng-container>\n <!-- <div class=\"jewel-container mt-2\">\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\n Making Charges\n </div>\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\n <div class=\"col-4\">\n <div class=\"row-header\">\n Net Weight\n </div>\n <div class=\"row-content\">\n {{responseData?.baseWeight}} </div>\n </div>\n <div class=\"col-4\">\n <div class=\"row-header\">\n Making Charge %\n </div>\n <div class=\"row-content\">\n {{responseData?.makingChargePercentage}}\n </div>\n </div>\n <div class=\"col-4\">\n <div class=\"row-header\">\n Value\n </div>\n <div class=\"row-content\">\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\n </div>\n </div>\n </div>\n </div> -->\n </div>\n </ng-container>\n </div>\n\n\n <!-- <div class=\"tab-group\">\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\n </div>\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\n </div>\n\n</ng-template>\n\n<ng-template #ImageSection>\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style1'\">\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </ng-container>\n </div>\n <div class=\"item-img\" (wheel)=\"scroll($event)\">\n <ng-container *ngIf=\"currentImg\">\n\n <!-- <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon> -->\n <ng-container *ngIf=\"!isMobile\">\n <img [src]=\"currentImg\" class=\"img zoom\" style=\"height: 100%; width: 100%;\" [simpoCorner]=\"styles?.corners\">\n </ng-container>\n <ng-container *ngIf=\"isMobile\">\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\" [simpoCorner]=\"styles?.corners\" class=\"zoom\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!currentImg\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\n [simpoCorner]=\"styles?.corners\">\n </ng-container>\n </div>\n <div class=\"img-list w-100\" *ngIf=\"screenWidth <= 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img zoom\" (click)=\"changeImg(img.imgUrl)\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style2'\">\n <div class=\"row h-100 overflow-scroll mt-0 w-100\">\n <ng-container *ngIf=\"itemImages?.length == 0\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\" class=\"img\"\n [simpoCorner]=\"styles?.corners\" class=\"col-12 h-100 p-0\">\n </ng-container>\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img col-6 h-75 p-1\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\"\n [class.h-100]=\"screenWidth <= 500\" [class.w-100]=\"itemImages?.length == 1\"\n [class.h-100]=\"itemImages?.length == 1\">\n </ng-container>\n </div>\n\n </ng-container>\n\n\n\n\n <div class=\"item-img\" *ngIf=\"varientLoading\">\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n }\">\n </ngx-skeleton-loader>\n </div>\n</ng-template>\n\n<ng-template #branding>\n <div class=\"row w-100\">\n <ng-container *ngFor=\"let brand of brandPromises\">\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 br-50\">\n <div class=\"brand-text w-100 text-center py-2\">\n {{brand?.title | titlecase}}\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #videoCallSchedule>\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\n <ng-container>\n <div class=\"row w-100 video-container\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"col-4\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/309136c1751978373588nem2jnwfor_2dfe4d7c.gif\" alt=\"\"\n class=\"w-100 h-100 \">\n </div>\n <div class=\"col-8 align-content-center\">\n <div class=\"video-head-text\">\n Live Video Call\n </div>\n <div class=\"sub-text\">\n Join a live video call with our consultants to see your favourite designs up close!\n </div>\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? opendailogbox(dialogBox) : ''\">\n Schedule a Video Call\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #DeliverySection>\n <div class=\"delivery-container\">\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\n\n <!-- Location Section -->\n <div class=\"location-section\">\n <div class=\"location-container d-flex align-items-center justify-content-between\">\n <div class=\"d-flex align-items-center w-90\">\n <div class=\"d-flex mx-1\"><mat-icon>gps_fixed</mat-icon>\n </div>\n <input type=\"number\" class=\"postal-code-input\" placeholder=\"Pin Code\" [(ngModel)]=\"pincode\">\n </div>\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\n </div>\n </div>\n <ng-container *ngIf=\"isDetails\">\n <!-- Free Delivery Section -->\n <div class=\"delivery-section\">\n <div class=\"d-flex align-items-center\">\n <span class=\"delivery-icon\">\uD83C\uDF81</span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Free\n Delivery by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }}</span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\n Order will\n Deliver by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }} with a Delivery Charge of\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\n </div>\n </div>\n\n <!-- Nearest Store Section -->\n <div class=\"store-section\">\n <div class=\"d-flex align-items-start store-item\">\n <span class=\"store-icon\">\uD83C\uDFEA</span>\n <div class=\"store-details\">\n <div class=\"store-text\">\n <span class=\"store-label\">Nearest Store - </span>\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.name | titlecase}}</span>\n <!-- <span class=\"store-distance\"> (4km)</span> -->\n </div>\n <!-- <div class=\"availability-section\">\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\n </div> -->\n <!-- <div class=\"other-stores-text\">\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\n </div> -->\n </div>\n </div>\n <div class=\"d-flex justify-content-center w-100\">\n <button class=\"find-store-btn\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.storeId)\">FIND IN\n STORE</button>\n </div>\n </div>\n\n <!-- Try At Home Section -->\n <!-- <div class=\"try-home-section\">\n <div class=\"d-flex align-items-start try-home-item\">\n <span class=\"home-icon\">\uD83C\uDFE0</span>\n <div class=\"try-home-details\">\n <div class=\"try-home-header\">\n <span class=\"try-home-text\">Try At Home</span>\n <span class=\"free-text\"> (It's Free)</span>\n </div>\n <div class=\"appointment-text\">\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\n <button class=\"book-appointment-btn\">BOOK HOME APPOINTMENT</button>\n </div>\n </div> -->\n\n </ng-container>\n </div>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\n aria-labelledby=\"offcanvasRightLabel\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n <div class=\"varient-price px-3 pb-2\">\n <div class=\"price-text\">Price</div>\n <div class=\"d-flex g-3 align-items-center\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"price\"\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\n [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"><span [innerHTML]='currency'></span>\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\n </div>\n </div>\n <div class=\"varient-container h-100 p-3\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"mb-15\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\n Customization</div>\n</div>\n\n<ng-template #dialogBox>\n <div class=\"modal-content\">\n\n <div class=\"schedule-header w-100 d-flex align-items-center justify-content-end p-2\">\n <mat-icon (click)=\"closeDialog()\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\n\n <div class=\"modal-body h-100 p-0\">\n\n <div class=\"row h-100 w-100 mt-3\">\n <div class=\"col-6\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/897651c1751980487170Vdo Call.gif\" alt=\"\"\n class=\"w-100\">\n </div>\n <div class=\"col-6 position-relative h-100\">\n\n <!-- Name Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\n (input)=\"onInputChange('username')\">\n </div>\n\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\n (input)=\"onInputChange('email')\">\n </div>\n\n <!-- Mobile Number Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\n <div class=\"sub-text-call\">IN +91</div>\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\n (input)=\"onInputChange('mobileNumber')\">\n </div>\n\n\n <!-- Pincode Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\n (input)=\"onInputChange('pincode')\">\n </div>\n <div class=\"language my-3\">\n <div class=\"mini-text mb-2\">Language Preference</div>\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\n <ng-container *ngFor=\"let lang of languages\">\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectedLang = lang\"\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\n {{lang}}\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"selectedLang == 'Others'\">\n <div class=\"input-field my-3\">\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\n </div>\n </ng-container>\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\n [disabled]=\"isSubmitting\">\n <ng-container *ngIf=\"isSubmitting\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n SCHEDULING...\n </ng-container>\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\n <mat-icon>video_call</mat-icon> \n SCHEDULE A VIDEO CALL\n </ng-container>\n <ng-container *ngIf=\"scheduled\">\n <mat-icon>check_circle</mat-icon> \n SCHEDULED SUCCESSFULLY\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-10-20\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n <div class=\"varient-price p-10-20\">\n <div class=\"price-break-header\">{{responseData?.name}}</div>\n </div>\n <div class=\"price-breakup h-100 w-100\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"price-container mb-3 p-10-20\">\n <div class=\"price-container-header\">\n {{ ele.materialType + \" BREAKUP\" }}\n </div>\n <div class=\"row w-100 header-row\">\n <div class=\"col-3\">COMPONENT</div>\n <div class=\"col-3\">RATE</div>\n <div class=\"col-3\">WEIGHT</div>\n <div class=\"col-3\">FINAL VALUE</div>\n </div>\n <div class=\"row w-100 value-row\">\n <div class=\"col-3\">{{ ele.materialPurity | titlecase }}</div>\n <div class=\"col-3\">\u20B9{{ getPricePerGram(ele.primaryMaterialWeight, ele.materialPrice) | number:'1.2-2' }}</div>\n <div class=\"col-3\">{{ ele.primaryMaterialWeight + \" grams\" }}</div>\n <div class=\"col-3 total\">\u20B9{{ ele.materialPrice | number:'1.2-2' }}</div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Making Charges</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Tax Amount</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Total Amount</div>\n <div class=\"col-6 text-end total\">\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\n number:'1.2-2'}}\n </div>\n </div>\n </div>\n </div>\n\n</div>", styles: [".product-desc{display:flex}*{font-family:Mulish!important}mat-icon{font-family:Material Icons!important}.strike-through{text-decoration:line-through;color:#d3d3d3}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon{border:1px solid;border-radius:8px;padding:5px;height:43px;width:40px;display:flex;align-items:center;justify-content:center;font-size:18px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.header-text{font-size:22px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:2%;border-radius:8px}.img-list{display:flex;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-size:32px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.product-detail{overflow-y:scroll}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:75%}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:20px;font-weight:600}.prod-img-block{height:100%;display:flex;flex-direction:column-reverse;justify-content:start;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc,.brief-desc{font-size:16px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0;min-height:95vh!important;height:unset!important}.product-heading{font-size:16px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;text-transform:uppercase}.favourite .mat-icon{min-height:40px;min-width:40px;font-size:25px;display:flex;align-items:center;justify-content:center;border-radius:5px;cursor:pointer}.border-solid{border:1px solid;border-radius:8px}a{text-decoration:none}.body-large{color:#848484}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}.mb-15{margin-bottom:15px}@media (min-width: 1400px){.container{max-width:1500px;width:100%}}.width-max{width:max-content}.width-34{width:33.3%!important}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.f-18{font-size:18px}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px}.varient-value{font-size:16px}.custom-text{border-radius:0 8px 8px 0}.br-50{border-radius:50%}.w-15{width:22%!important}.scroll-wrap{overflow:scroll;flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid;margin:10px 0;border-radius:12px;padding:5px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:13px}.sch-btn{width:100%;color:#fff;padding:10px 0;margin-top:5px;border-radius:12px;font-size:18px}.tax-text{font-size:12px}.modal-dialog{position:absolute!important;top:15%!important;left:30%!important;width:53%!important;height:75vh!important;max-width:unset!important;background:#fff;border-radius:18px!important}.schedule-header{border-radius:18px 18px 0 0}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:15px 0;background-color:transparent}.delivery-title{font-size:22px;font-weight:600;margin:0 0 12px;line-height:1.2}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:12px 10px;margin-bottom:15px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:16px;font-weight:600;color:#374151;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{color:#9ca3af;font-weight:500}.locate-btn{background:none!important;border:none!important;color:#6b7280!important;font-weight:500;font-size:15px!important;padding:0!important;box-shadow:none!important;width:20%!important}.locate-btn:hover{color:#374151!important}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid #cfcfcf;padding:12px 8px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:16px;font-weight:700}.store-section{border:1px solid #cfcfcf;padding:12px 2px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:20px;padding-left:8px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:16px;margin-bottom:8px;line-height:1.4}.store-label{color:#374151}.store-name{font-weight:700;color:#374151}.store-distance{color:#6b7280}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:95%!important;padding:8px 20px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:12px;border:1px solid #cfcfcf}.try-home-item{margin-bottom:20px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-header{margin-bottom:4px;line-height:1.4}.try-home-text{font-size:16px;font-weight:700;color:#374151}.free-text{font-size:16px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:linear-gradient(135deg,#8b5cf6,#a855f7);color:#fff;border:none;padding:8px 20px;border-radius:12px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease}.book-appointment-btn:hover{background:linear-gradient(135deg,#7c3aed,#9333ea);transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}@media (max-width: 480px){.delivery-container{padding:12px}.location-section{padding:12px 20px}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.border-unset{border:unset!important}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:15%;width:35%}.rating{width:max-content;border:1px solid;border-radius:50px;padding:2px}.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.rating-no{padding-right:12px;margin:2px 0;border-right:1px solid}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.me-2{margin-right:.5rem}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i10.DecimalPipe, name: "number" }, { kind: "pipe", type: i10.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i10.DatePipe, name: "date" }, { kind: "pipe", type: i10.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i11.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: i11.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i12.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i13.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i14.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "edit", "customClass", "delete", "nextComponentColor"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId", "iconColor"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i15.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "component", type: i16.SpeedDial, selector: "p-speedDial", inputs: ["id", "model", "visible", "style", "className", "direction", "transitionDelay", "type", "radius", "mask", "disabled", "hideOnClickOutside", "buttonStyle", "buttonClassName", "maskStyle", "maskClassName", "showIcon", "hideIcon", "rotateAnimation", "ariaLabel", "ariaLabelledBy"], outputs: ["onVisibleChange", "visibleChange", "onClick", "onShow", "onHide"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i17.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: SvgDividerComponent, selector: "simpo-svg-divider", inputs: ["dividerType", "color"] }, { kind: "directive", type: CornerDirective, selector: "[simpoCorner]", inputs: ["simpoCorner"] }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId"] }] }); }
|
722
741
|
}
|
723
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.
|
742
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductDescComponent, decorators: [{
|
724
743
|
type: Component,
|
725
744
|
args: [{ selector: 'simpo-product-desc', standalone: true, imports: [
|
726
745
|
CommonModule,
|
@@ -747,7 +766,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
|
|
747
766
|
SvgDividerComponent,
|
748
767
|
CornerDirective,
|
749
768
|
ButtonEditorDirective
|
750
|
-
], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\r\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div>\r\n <section class=\"container p-0\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\r\n <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div>\r\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\"\r\n [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\r\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\r\n <div class=\"prod-img-block\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-4 col-12 h-100 product-detail\" #d2>\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <div class=\"product-sku\">\r\n <!-- <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div> -->\r\n <div\r\n *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">\r\n Category : <a href=\"javascript:void(0)\" (click)=\"goToFilter(cat.refName)\"\r\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\r\n titlecase}} <ng-container\r\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\r\n </a></div>\r\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\r\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\r\n </span></div>\r\n </div>\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\r\n </div>\r\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\r\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <div class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">Out of\r\n Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\" simpoButtonDirective\r\n [id]=\"buttonId\" [buttonStyle]=\"button?.styles\" [backgroundInfo]=\"styles?.background\"\r\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"opendailogbox(dialogBox)\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addToCart()\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div class=\"favourite border-solid\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-product\">\r\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-15\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\" [style.color]=\"data?.styles?.background?.accentColor\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-600\" [style.color]=\"data?.styles?.background?.accentColor\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"d-flex flex-column\" style=\"margin-top: 15px;\"\r\n *ngIf=\"responseData?.averageRating && responseData?.totalReviewCount\">\r\n <div class=\"rating d-flex justify-content-center gap-2\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"rating-no my-1\">{{\"\u2B50\" + (responseData?.averageRating | number:'1.1-2')}}</div>\r\n <div class=\"total-ratings my-1\">{{responseData?.totalReviewCount == 1 ? '1 Rating' :\r\n getRatings(responseData?.totalReviewCount) + \" \" + \"ratings\"}}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\" [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\">\r\n <span [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}\r\n </div>\r\n </div>\r\n <div class=\"tax-text\">(MRP Inclusive all taxes)</div>\r\n </div>\r\n <div class=\"heading-large trim-text\" class=\"product-heading\">{{responseData?.name}}</div>\r\n <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc\">\r\n <div>\r\n <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n + PRICE BREAKUP\r\n </div>\r\n </div>\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\" [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\"\r\n [style.color]=\"ele.materialType == 'DIAMOND' ? '#fff' : ''\">\r\n {{ele.materialType | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6\">\r\n <div class=\"row-header\">\r\n Net Weight/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.primaryMaterialWeight + \" \" + 'grams'}}\r\n </div>\r\n </div>\r\n <div class=\"col-6\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.materialPurity}}\r\n </div>\r\n </div>\r\n <!-- <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Price/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\r\n Making Charges\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Net Weight\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.baseWeight}} </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Making Charge %\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.makingChargePercentage}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"tab-group\">\r\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style1'\">\r\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </ng-container>\r\n </div>\r\n <div class=\"item-img\" (wheel)=\"scroll($event)\">\r\n <ng-container *ngIf=\"currentImg\">\r\n\r\n <!-- <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon> -->\r\n <ng-container *ngIf=\"!isMobile\">\r\n <img [src]=\"currentImg\" class=\"img zoom\" style=\"height: 100%; width: 100%;\" [simpoCorner]=\"styles?.corners\">\r\n </ng-container>\r\n <ng-container *ngIf=\"isMobile\">\r\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\" [simpoCorner]=\"styles?.corners\" class=\"zoom\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!currentImg\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n [simpoCorner]=\"styles?.corners\">\r\n </ng-container>\r\n </div>\r\n <div class=\"img-list w-100\" *ngIf=\"screenWidth <= 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img zoom\" (click)=\"changeImg(img.imgUrl)\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style2'\">\r\n <div class=\"row h-100 overflow-scroll mt-0 w-100\">\r\n <ng-container *ngIf=\"itemImages?.length == 0\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\" class=\"img\"\r\n [simpoCorner]=\"styles?.corners\" class=\"col-12 h-100 p-0\">\r\n </ng-container>\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img col-6 h-75 p-1\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\"\r\n [class.h-100]=\"screenWidth <= 500\" [class.w-100]=\"itemImages?.length == 1\"\r\n [class.h-100]=\"itemImages?.length == 1\">\r\n </ng-container>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 br-50\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"col-4\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/275354c1750835096471Animation - 1750835001220.gif\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"col-8 align-content-center\" [style.color]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <div class=\"sch-btn text-center cursor-pointer\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"opendailogbox(dialogBox)\">\r\n Schedule a Video Call\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\" [style.color]=\"data?.styles?.background?.accentColor\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\">\r\n <div class=\"d-flex align-items-center w-90\">\r\n <div class=\"d-flex mx-1\"><mat-icon [style.color]=\"data?.styles?.background?.accentColor\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input\" placeholder=\"Pin Code\" [(ngModel)]=\"pincode\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"isDetails\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon\">\uD83C\uDF81</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Free\r\n Delivery by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n Order will\r\n Deliver by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Nearest Store Section -->\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-start store-item\">\r\n <span class=\"store-icon\">\uD83C\uDFEA</span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.name | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.storeId)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Try At Home Section -->\r\n <!-- <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon\">\uD83C\uDFE0</span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\">BOOK HOME APPOINTMENT</button>\r\n </div>\r\n </div> -->\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"><span [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-15\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n\r\n <div class=\"schedule-header w-100 d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"closeDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n\r\n <div class=\"modal-body h-100 p-0\">\r\n\r\n <div class=\"row h-100 w-100 mt-3\">\r\n <div class=\"col-6\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/603782c1750925995765Animation - 1750925947618.gif\"\r\n alt=\"\" class=\"h-100 w-100\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100\">\r\n\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n <!-- Pincode Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div>\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\r\n [disabled]=\"isSubmitting\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <mat-icon>video_call</mat-icon> \r\n SCHEDULE A VIDEO CALL\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon> \r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-10-20\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3\">COMPONENT</div>\r\n <div class=\"col-3\">RATE</div>\r\n <div class=\"col-3\">WEIGHT</div>\r\n <div class=\"col-3\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3\">{{ ele.materialPurity | titlecase }}</div>\r\n <div class=\"col-3\">\u20B9{{ getPricePerGram(ele.primaryMaterialWeight, ele.materialPrice) | number:'1.2-2' }}</div>\r\n <div class=\"col-3\">{{ ele.primaryMaterialWeight + \" grams\" }}</div>\r\n <div class=\"col-3 total\">\u20B9{{ ele.materialPrice | number:'1.2-2' }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>", styles: [".product-desc{display:flex}*{font-family:Mulish!important}mat-icon{font-family:Material Icons!important}.strike-through{text-decoration:line-through;color:#d3d3d3}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon{border:1px solid;border-radius:8px;padding:5px;height:43px;width:40px;display:flex;align-items:center;justify-content:center;font-size:18px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.header-text{font-size:22px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:2%;border-radius:8px}.img-list{display:flex;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-size:32px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.product-detail{overflow-y:scroll}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:75%}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:20px;font-weight:600}.prod-img-block{height:100%;display:flex;flex-direction:column-reverse;justify-content:start;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc,.brief-desc{font-size:16px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0;min-height:95vh!important;height:unset!important}.product-heading{font-size:16px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;text-transform:uppercase}.favourite .mat-icon{min-height:40px;min-width:40px;font-size:25px;display:flex;align-items:center;justify-content:center;border-radius:5px;cursor:pointer}.border-solid{border:1px solid;border-radius:8px}a{text-decoration:none}.body-large{color:#848484}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}.mb-15{margin-bottom:15px}@media (min-width: 1400px){.container{max-width:1500px;width:100%}}.width-max{width:max-content}.width-34{width:33.3%!important}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.f-18{font-size:18px}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px}.varient-value{font-size:16px}.custom-text{border-radius:0 8px 8px 0}.br-50{border-radius:50%}.w-15{width:22%!important}.scroll-wrap{overflow:scroll;flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid;margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:13px}.sch-btn{width:100%;color:#fff;padding:10px 0;margin-top:5px;border-radius:12px;font-size:18px}.tax-text{font-size:12px}.modal-dialog{position:absolute!important;top:15%!important;left:30%!important;width:53%!important;height:75vh!important;max-width:unset!important;background:#fff;border-radius:18px!important}.schedule-header{border-radius:18px 18px 0 0}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:15px 0;background-color:transparent}.delivery-title{font-size:22px;font-weight:600;margin:0 0 12px;line-height:1.2}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:12px 10px;margin-bottom:15px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:16px;font-weight:600;color:#374151;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{color:#9ca3af;font-weight:500}.locate-btn{background:none!important;border:none!important;color:#6b7280!important;font-weight:500;font-size:15px!important;padding:0!important;box-shadow:none!important;width:20%!important}.locate-btn:hover{color:#374151!important}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid #cfcfcf;padding:12px 8px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:16px;font-weight:700}.store-section{border:1px solid #cfcfcf;padding:12px 2px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:20px;padding-left:8px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:16px;margin-bottom:8px;line-height:1.4}.store-label{color:#374151}.store-name{font-weight:700;color:#374151}.store-distance{color:#6b7280}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:95%!important;padding:8px 20px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:12px;border:1px solid #cfcfcf}.try-home-item{margin-bottom:20px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-header{margin-bottom:4px;line-height:1.4}.try-home-text{font-size:16px;font-weight:700;color:#374151}.free-text{font-size:16px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:linear-gradient(135deg,#8b5cf6,#a855f7);color:#fff;border:none;padding:8px 20px;border-radius:12px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease}.book-appointment-btn:hover{background:linear-gradient(135deg,#7c3aed,#9333ea);transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}@media (max-width: 480px){.delivery-container{padding:12px}.location-section{padding:12px 20px}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.border-unset{border:unset!important}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:15%;width:35%}.rating{width:max-content;border:1px solid;border-radius:50px;padding:2px}.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.rating-no{padding-right:12px;margin:2px 0;border-right:1px solid}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.me-2{margin-right:.5rem}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}\n"] }]
|
769
|
+
], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\n\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\n </div>\n <section class=\"container p-0\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\n <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\n (click)=\"routeToHome()\">Home</a> /\n <span>{{ responseData?.name | titlecase }}</span>\n </div>\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\"\n [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\n <div class=\"prod-img-block\">\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\n </div>\n </div>\n <div class=\"col-lg-4 col-12 h-100 product-detail\" #d2>\n <ng-container *ngIf=\"isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\n\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\n </ng-container>\n\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\n </ng-container>\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\n </ng-container>\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\n </ng-container>\n\n\n\n <ng-container>\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\n </ng-container>\n\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\n [innerHTML]=\"responseData.brief\"></div> -->\n <div class=\"product-sku\">\n <!-- <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div> -->\n <div\n *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">\n Category : <a href=\"javascript:void(0)\" (click)=\"goToFilter(cat.refName)\"\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\n titlecase}} <ng-container\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\n </a></div>\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\n </span></div>\n </div>\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\n <!-- <ng-container>\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\n </ng-container> -->\n </div>\n </div>\n </section>\n <ng-container *ngIf=\"relatedProductData?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\n </ng-container>\n <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\"></simpo-featured-products>\n </ng-container>\n <!-- <ng-container>\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\n </ng-container> -->\n\n <ng-container *ngIf=\"styles?.devider?.display\">\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\n </ng-container>\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n\n<div class=\"mobile-footer\">\n <div class=\"icons\">\n <div (click)=\"goToCart()\">\n <mat-icon>shopping_cart</mat-icon>\n </div>\n <div>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n </div>\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\n </div>\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\n</div>\n\n<ng-template #ReviewSection>\n <div class=\"review-sec\">\n <div class=\"title\">Customer Review</div>\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\n <span>Be the first to write a review</span>\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\n Review' : 'Cancel Review'}}</button>\n <ng-container *ngIf=\"showReview\">\n <hr />\n <div class=\"user-review\">\n <div class=\"title\">Write a review</div>\n <span class=\"secondary-text\">RATING</span>\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\n <div>\n <span class=\"secondary-text\">Review Title</span>\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\n </div>\n <div>\n <span class=\"secondary-text\">Review</span>\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\n </div>\n <div class=\"review-action-btn\">\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\n (click)=\"addProductReview()\"\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\n review</button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #SocialIcons>\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\n <div style=\"position: relative;margin-right: 10px;\">\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\n [sectionId]=\"data?.id\"></simpo-socia-icons>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #ActionBtn>\n <div class=\"button-parent\">\n <div class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\"\n [style.color]=\"data?.styles?.background?.accentColor\">Out of\n Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\n </div>\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? opendailogbox(dialogBox) : ''\">\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(0)\"\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n <div class=\"favourite border-solid\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n <div class=\"share-product\">\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\" [style.color]=\"data?.styles?.background?.accentColor\"\n [style.borderColor]=\"data?.styles?.background?.accentColor\">share</mat-icon>\n </div>\n </div>\n</ng-template>\n\n<ng-template #variants>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"mb-15\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\n <ng-container>\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"variant-head\" [style.color]=\"data?.styles?.background?.accentColor\">{{item.key | titlecase}}</div>\n <div class=\"variant-value text-start fw-600\" [style.color]=\"data?.styles?.background?.accentColor\">\n {{item.value |\n titlecase}}</div>\n </div>\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #ProductDesc>\n <div class=\"d-flex flex-column\" style=\"margin-top: 15px;\"\n *ngIf=\"responseData?.averageRating && responseData?.totalReviewCount\">\n <div class=\"rating d-flex justify-content-center gap-2\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"rating-no my-1\">{{\"\u2B50\" + (responseData?.averageRating | number:'1.1-2')}}</div>\n <div class=\"total-ratings my-1\">{{responseData?.totalReviewCount == 1 ? '1 Rating' :\n getRatings(responseData?.totalReviewCount) + \" \" + \"ratings\"}}</div>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"price\" [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\">\n <span [innerHTML]='currency'></span>\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}\n </div>\n </div>\n <div class=\"tax-text\">(MRP Inclusive all taxes)</div>\n </div>\n <div class=\"heading-large trim-text\" class=\"product-heading\">{{responseData?.name}}</div>\n <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\n\n</ng-template>\n\n<ng-template #descriptors>\n <div class=\"row prod-desc\">\n <div>\n <div class=\"product-header d-flex align-items-center justify-content-between\">\n <span class=\"header-text\"\n *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n + PRICE BREAKUP\n </div>\n </div>\n <div class=\"description\">\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name\" [style.background]=\"data?.styles?.background?.color\"></div>\n </div>\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\n <div class=\"jewellery-table-container\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"jewel-container mt-2\">\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\"\n [style.color]=\"ele.materialType == 'DIAMOND' ? '#fff' : ''\">\n {{ele.materialType | titlecase}}\n </div>\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\n <div class=\"col-6\">\n <div class=\"row-header\">\n Net Weight/Gram\n </div>\n <div class=\"row-content\">\n {{ele.primaryMaterialWeight + \" \" + 'grams'}}\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row-header\">\n Purity\n </div>\n <div class=\"row-content\">\n {{ele.materialPurity}}\n </div>\n </div>\n <!-- <div class=\"col-4\">\n <div class=\"row-header\">\n Price/Gram\n </div>\n <div class=\"row-content\">\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\n number:'1.2-2'}}\n </div>\n </div>\n <div class=\"col-4\">\n <div class=\"row-header\">\n Value\n </div>\n <div class=\"row-content\">\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\n </div>\n </div> -->\n </div>\n </div>\n </ng-container>\n <!-- <div class=\"jewel-container mt-2\">\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\n Making Charges\n </div>\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\n <div class=\"col-4\">\n <div class=\"row-header\">\n Net Weight\n </div>\n <div class=\"row-content\">\n {{responseData?.baseWeight}} </div>\n </div>\n <div class=\"col-4\">\n <div class=\"row-header\">\n Making Charge %\n </div>\n <div class=\"row-content\">\n {{responseData?.makingChargePercentage}}\n </div>\n </div>\n <div class=\"col-4\">\n <div class=\"row-header\">\n Value\n </div>\n <div class=\"row-content\">\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\n </div>\n </div>\n </div>\n </div> -->\n </div>\n </ng-container>\n </div>\n\n\n <!-- <div class=\"tab-group\">\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\n </div>\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\n </div>\n\n</ng-template>\n\n<ng-template #ImageSection>\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style1'\">\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </ng-container>\n </div>\n <div class=\"item-img\" (wheel)=\"scroll($event)\">\n <ng-container *ngIf=\"currentImg\">\n\n <!-- <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon> -->\n <ng-container *ngIf=\"!isMobile\">\n <img [src]=\"currentImg\" class=\"img zoom\" style=\"height: 100%; width: 100%;\" [simpoCorner]=\"styles?.corners\">\n </ng-container>\n <ng-container *ngIf=\"isMobile\">\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\" [simpoCorner]=\"styles?.corners\" class=\"zoom\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!currentImg\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\n [simpoCorner]=\"styles?.corners\">\n </ng-container>\n </div>\n <div class=\"img-list w-100\" *ngIf=\"screenWidth <= 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img zoom\" (click)=\"changeImg(img.imgUrl)\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!varientLoading && data?.styles?.gridStyle == 'Style2'\">\n <div class=\"row h-100 overflow-scroll mt-0 w-100\">\n <ng-container *ngIf=\"itemImages?.length == 0\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\" class=\"img\"\n [simpoCorner]=\"styles?.corners\" class=\"col-12 h-100 p-0\">\n </ng-container>\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img col-6 h-75 p-1\" (click)=\"changeImg(img.imgUrl)\" [simpoCorner]=\"styles?.corners\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\"\n [class.h-100]=\"screenWidth <= 500\" [class.w-100]=\"itemImages?.length == 1\"\n [class.h-100]=\"itemImages?.length == 1\">\n </ng-container>\n </div>\n\n </ng-container>\n\n\n\n\n <div class=\"item-img\" *ngIf=\"varientLoading\">\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n }\">\n </ngx-skeleton-loader>\n </div>\n</ng-template>\n\n<ng-template #branding>\n <div class=\"row w-100\">\n <ng-container *ngFor=\"let brand of brandPromises\">\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 br-50\">\n <div class=\"brand-text w-100 text-center py-2\">\n {{brand?.title | titlecase}}\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #videoCallSchedule>\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\n <ng-container>\n <div class=\"row w-100 video-container\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\n <div class=\"col-4\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/309136c1751978373588nem2jnwfor_2dfe4d7c.gif\" alt=\"\"\n class=\"w-100 h-100 \">\n </div>\n <div class=\"col-8 align-content-center\">\n <div class=\"video-head-text\">\n Live Video Call\n </div>\n <div class=\"sub-text\">\n Join a live video call with our consultants to see your favourite designs up close!\n </div>\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? opendailogbox(dialogBox) : ''\">\n Schedule a Video Call\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #DeliverySection>\n <div class=\"delivery-container\">\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\n\n <!-- Location Section -->\n <div class=\"location-section\">\n <div class=\"location-container d-flex align-items-center justify-content-between\">\n <div class=\"d-flex align-items-center w-90\">\n <div class=\"d-flex mx-1\"><mat-icon>gps_fixed</mat-icon>\n </div>\n <input type=\"number\" class=\"postal-code-input\" placeholder=\"Pin Code\" [(ngModel)]=\"pincode\">\n </div>\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\n </div>\n </div>\n <ng-container *ngIf=\"isDetails\">\n <!-- Free Delivery Section -->\n <div class=\"delivery-section\">\n <div class=\"d-flex align-items-center\">\n <span class=\"delivery-icon\">\uD83C\uDF81</span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Free\n Delivery by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }}</span>\n\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\n Order will\n Deliver by {{ storeDetails?.estimatedDeliveryDate | date:'d MMM' }} with a Delivery Charge of\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\n </div>\n </div>\n\n <!-- Nearest Store Section -->\n <div class=\"store-section\">\n <div class=\"d-flex align-items-start store-item\">\n <span class=\"store-icon\">\uD83C\uDFEA</span>\n <div class=\"store-details\">\n <div class=\"store-text\">\n <span class=\"store-label\">Nearest Store - </span>\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.name | titlecase}}</span>\n <!-- <span class=\"store-distance\"> (4km)</span> -->\n </div>\n <!-- <div class=\"availability-section\">\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\n </div> -->\n <!-- <div class=\"other-stores-text\">\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\n </div> -->\n </div>\n </div>\n <div class=\"d-flex justify-content-center w-100\">\n <button class=\"find-store-btn\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.storeId)\">FIND IN\n STORE</button>\n </div>\n </div>\n\n <!-- Try At Home Section -->\n <!-- <div class=\"try-home-section\">\n <div class=\"d-flex align-items-start try-home-item\">\n <span class=\"home-icon\">\uD83C\uDFE0</span>\n <div class=\"try-home-details\">\n <div class=\"try-home-header\">\n <span class=\"try-home-text\">Try At Home</span>\n <span class=\"free-text\"> (It's Free)</span>\n </div>\n <div class=\"appointment-text\">\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\n <button class=\"book-appointment-btn\">BOOK HOME APPOINTMENT</button>\n </div>\n </div> -->\n\n </ng-container>\n </div>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\n aria-labelledby=\"offcanvasRightLabel\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n <div class=\"varient-price px-3 pb-2\">\n <div class=\"price-text\">Price</div>\n <div class=\"d-flex g-3 align-items-center\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\n [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"price\"\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\n [ngClass]=\"{'strike-through': responseData?.price?.discountedPrice}\"><span [innerHTML]='currency'></span>\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\n </div>\n </div>\n <div class=\"varient-container h-100 p-3\">\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div class=\"mb-15\">\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\n Customization</div>\n</div>\n\n<ng-template #dialogBox>\n <div class=\"modal-content\">\n\n <div class=\"schedule-header w-100 d-flex align-items-center justify-content-end p-2\">\n <mat-icon (click)=\"closeDialog()\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\n\n <div class=\"modal-body h-100 p-0\">\n\n <div class=\"row h-100 w-100 mt-3\">\n <div class=\"col-6\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/897651c1751980487170Vdo Call.gif\" alt=\"\"\n class=\"w-100\">\n </div>\n <div class=\"col-6 position-relative h-100\">\n\n <!-- Name Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\n (input)=\"onInputChange('username')\">\n </div>\n\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\n (input)=\"onInputChange('email')\">\n </div>\n\n <!-- Mobile Number Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\n <div class=\"sub-text-call\">IN +91</div>\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\n (input)=\"onInputChange('mobileNumber')\">\n </div>\n\n\n <!-- Pincode Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\n (input)=\"onInputChange('pincode')\">\n </div>\n <div class=\"language my-3\">\n <div class=\"mini-text mb-2\">Language Preference</div>\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\n <ng-container *ngFor=\"let lang of languages\">\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectedLang = lang\"\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\n {{lang}}\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"selectedLang == 'Others'\">\n <div class=\"input-field my-3\">\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\n </div>\n </ng-container>\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\n [disabled]=\"isSubmitting\">\n <ng-container *ngIf=\"isSubmitting\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n SCHEDULING...\n </ng-container>\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\n <mat-icon>video_call</mat-icon> \n SCHEDULE A VIDEO CALL\n </ng-container>\n <ng-container *ngIf=\"scheduled\">\n <mat-icon>check_circle</mat-icon> \n SCHEDULED SUCCESSFULLY\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\n <div class=\"varient-header d-flex align-items-center justify-content-end p-10-20\">\n <mat-icon data-bs-dismiss=\"offcanvas\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n <div class=\"varient-price p-10-20\">\n <div class=\"price-break-header\">{{responseData?.name}}</div>\n </div>\n <div class=\"price-breakup h-100 w-100\">\n <ng-container *ngFor=\"let ele of responseData?.materials\">\n <div class=\"price-container mb-3 p-10-20\">\n <div class=\"price-container-header\">\n {{ ele.materialType + \" BREAKUP\" }}\n </div>\n <div class=\"row w-100 header-row\">\n <div class=\"col-3\">COMPONENT</div>\n <div class=\"col-3\">RATE</div>\n <div class=\"col-3\">WEIGHT</div>\n <div class=\"col-3\">FINAL VALUE</div>\n </div>\n <div class=\"row w-100 value-row\">\n <div class=\"col-3\">{{ ele.materialPurity | titlecase }}</div>\n <div class=\"col-3\">\u20B9{{ getPricePerGram(ele.primaryMaterialWeight, ele.materialPrice) | number:'1.2-2' }}</div>\n <div class=\"col-3\">{{ ele.primaryMaterialWeight + \" grams\" }}</div>\n <div class=\"col-3 total\">\u20B9{{ ele.materialPrice | number:'1.2-2' }}</div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Making Charges</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Tax Amount</div>\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\n </div>\n </div>\n <div class=\"row w-100 summary-row\">\n <div class=\"col-6 text-start\">Total Amount</div>\n <div class=\"col-6 text-end total\">\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\n number:'1.2-2'}}\n </div>\n </div>\n </div>\n </div>\n\n</div>", styles: [".product-desc{display:flex}*{font-family:Mulish!important}mat-icon{font-family:Material Icons!important}.strike-through{text-decoration:line-through;color:#d3d3d3}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon{border:1px solid;border-radius:8px;padding:5px;height:43px;width:40px;display:flex;align-items:center;justify-content:center;font-size:18px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.header-text{font-size:22px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:2%;border-radius:8px}.img-list{display:flex;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-size:32px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.product-detail{overflow-y:scroll}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:75%}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:20px;font-weight:600}.prod-img-block{height:100%;display:flex;flex-direction:column-reverse;justify-content:start;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc,.brief-desc{font-size:16px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0;min-height:95vh!important;height:unset!important}.product-heading{font-size:16px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;text-transform:uppercase}.favourite .mat-icon{min-height:40px;min-width:40px;font-size:25px;display:flex;align-items:center;justify-content:center;border-radius:5px;cursor:pointer}.border-solid{border:1px solid;border-radius:8px}a{text-decoration:none}.body-large{color:#848484}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}.mb-15{margin-bottom:15px}@media (min-width: 1400px){.container{max-width:1500px;width:100%}}.width-max{width:max-content}.width-34{width:33.3%!important}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.f-18{font-size:18px}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px}.varient-value{font-size:16px}.custom-text{border-radius:0 8px 8px 0}.br-50{border-radius:50%}.w-15{width:22%!important}.scroll-wrap{overflow:scroll;flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid;margin:10px 0;border-radius:12px;padding:5px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:13px}.sch-btn{width:100%;color:#fff;padding:10px 0;margin-top:5px;border-radius:12px;font-size:18px}.tax-text{font-size:12px}.modal-dialog{position:absolute!important;top:15%!important;left:30%!important;width:53%!important;height:75vh!important;max-width:unset!important;background:#fff;border-radius:18px!important}.schedule-header{border-radius:18px 18px 0 0}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:15px 0;background-color:transparent}.delivery-title{font-size:22px;font-weight:600;margin:0 0 12px;line-height:1.2}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:12px 10px;margin-bottom:15px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:16px;font-weight:600;color:#374151;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{color:#9ca3af;font-weight:500}.locate-btn{background:none!important;border:none!important;color:#6b7280!important;font-weight:500;font-size:15px!important;padding:0!important;box-shadow:none!important;width:20%!important}.locate-btn:hover{color:#374151!important}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid #cfcfcf;padding:12px 8px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:16px;font-weight:700}.store-section{border:1px solid #cfcfcf;padding:12px 2px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:20px;padding-left:8px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:16px;margin-bottom:8px;line-height:1.4}.store-label{color:#374151}.store-name{font-weight:700;color:#374151}.store-distance{color:#6b7280}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:95%!important;padding:8px 20px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:12px;border:1px solid #cfcfcf}.try-home-item{margin-bottom:20px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-header{margin-bottom:4px;line-height:1.4}.try-home-text{font-size:16px;font-weight:700;color:#374151}.free-text{font-size:16px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:linear-gradient(135deg,#8b5cf6,#a855f7);color:#fff;border:none;padding:8px 20px;border-radius:12px;font-weight:600;font-size:16px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease}.book-appointment-btn:hover{background:linear-gradient(135deg,#7c3aed,#9333ea);transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}@media (max-width: 480px){.delivery-container{padding:12px}.location-section{padding:12px 20px}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.border-unset{border:unset!important}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:15%;width:35%}.rating{width:max-content;border:1px solid;border-radius:50px;padding:2px}.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.rating-no{padding-right:12px;margin:2px 0;border-right:1px solid}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.me-2{margin-right:.5rem}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}\n"] }]
|
751
770
|
}], ctorParameters: () => [{ type: Object, decorators: [{
|
752
771
|
type: Inject,
|
753
772
|
args: [PLATFORM_ID]
|
@@ -775,4 +794,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
|
|
775
794
|
type: HostListener,
|
776
795
|
args: ["window: resize", ["$event"]]
|
777
796
|
}] } });
|
778
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBMEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25JLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFekYsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBTWpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixP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dUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ3BDLEVBQUU7c0JBQWxCLFNBQVM7dUJBQUMsSUFBSTtnQkFHTixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFnT04sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUHJvZHVjdERlc2NNb2RhbCwgUHJvZHVjdERlc2NTdHlsZXNNb2RhbCB9IGZyb20gJy4vcHJvZHVjdC1kZXNjLm1vZGFsJztcclxuaW1wb3J0IHsgSXRlbUltYWdlLCBJdGVtVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTW9kZWwsIEJ1dHRvbk1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcclxuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2FuaW1hdGlvbi1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbnRlbnRGaXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29udGVudC1maXQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2ltcG9Db21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2luZGV4JztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE5neEltYWdlWm9vbU1vZHVsZSB9IGZyb20gJ25neC1pbWFnZS16b29tJztcclxuaW1wb3J0IHsgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCB9IGZyb20gXCIuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRmVhdHVyZWRQcm9kdWN0TW9kYWwgfSBmcm9tICcuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5tb2RhbCc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xyXG5pbXBvcnQgeyBCVVNJTkVTU19DT05TVEFOVFMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYnVzaW5lc3MuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1ldGEsIFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEl0ZW1WYXJpZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vaXRlbS12YXJpZW50L2l0ZW0tdmFyaWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCb3R0b21TaGVldCwgTWF0Qm90dG9tU2hlZXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9ib3R0b20tc2hlZXQnO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2JhY2tncm91bmQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2ltcG9XcmFwQ29tbnRhaW5lciB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS93cmFwLWNvbnRhaW5lcnMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29sb3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29sb3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU29jaWFJY29uc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL3NvY2lhLWljb25zL3NvY2lhLWljb25zLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJhdGluZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcmF0aW5nJztcclxuaW1wb3J0IHsgUmV2aWV3IH0gZnJvbSAnLi4vLi4vc3R5bGVzL3Jldmlldy5tb2RhbCc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi9zdHlsZXMvdXNlci5tb2RhbCc7XHJcbmltcG9ydCB7IFNwZWVkRGlhbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc3BlZWRkaWFsJztcclxuaW1wb3J0IHsgQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zZWN0aW9ucy9jdXN0b21lci1yZXZpZXcvY3VzdG9tZXItcmV2aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wYW5lbCc7XHJcbmltcG9ydCB7IFN2Z0RpdmlkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9zdmctZGl2aWRlci9zdmctZGl2aWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb3JuZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29ybmVyLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZWRpdG9yLmRpcmVjdGl2ZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtZGVzYycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIENvbG9yRGlyZWN0aXZlLFxyXG4gICAgLy9ESVJFQ1RJVkVcclxuICAgIFNpbXBvV3JhcENvbW50YWluZXIsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlLFxyXG4gICAgQW5pbWF0aW9uRGlyZWN0aXZlLFxyXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgTmd4SW1hZ2Vab29tTW9kdWxlLFxyXG4gICAgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCxcclxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxyXG4gICAgU29jaWFJY29uc0NvbXBvbmVudCxcclxuICAgIFJhdGluZ01vZHVsZSxcclxuICAgIFNwZWVkRGlhbE1vZHVsZSxcclxuICAgIFRvYXN0TW9kdWxlLFxyXG4gICAgQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsXHJcbiAgICBQYW5lbE1vZHVsZSxcclxuICAgIFN2Z0RpdmlkZXJDb21wb25lbnQsXHJcbiAgICBDb3JuZXJEaXJlY3RpdmUsXHJcbiAgICBCdXR0b25FZGl0b3JEaXJlY3RpdmVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGVzY0NvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIHtcclxuICBAVmlld0NoaWxkKEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgcmV2aWV3Q29tcG9uZW50ITogQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnZDInKSBkMiE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICBASW5wdXQoKSBkYXRhPzogUHJvZHVjdERlc2NNb2RhbDtcclxuICBASW5wdXQoKSByZXNwb25zZURhdGEhOiBQcm9kdWN0O1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGVkaXQ/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIG5leHRDb21wb25lbnRDb2xvcj86IEJhY2tncm91bmRNb2RlbDtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmVhdHVyZVByb2R1Y3REYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyByZWNlbnRWaWV3ZWREYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyB2YXJpZW50czogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFZhcmllbnQ6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG5cclxuICBwdWJsaWMgcmVsYXRlZFByb2R1Y3REYXRhOiBQcm9kdWN0W10gPSBbXTtcclxuICBwdWJsaWMgcHJvZHVjdFJldmlldzogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgdG90YWxSZXZpZXc6IG51bWJlciA9IDU7XHJcbiAgcHVibGljIHNob3dSZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YVRhZ1NlcnZpY2U6IE1ldGEsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU2VydmljZTogVGl0bGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldCxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXHJcblxyXG4gICkge1xyXG5cclxuICAgIHN1cGVyKClcclxuXHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6IFwiZGVzY3JpcHRpb25cIiwgY29udGVudDogXCJUZXN0aW5nXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnRpdGxlXCIsIGNvbnRlbnQ6IFwiVGl0bGVcIiB9KTtcclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6aW1hZ2VcIiwgY29udGVudDogXCJodHRwczovL2Rldi1iZWVvcy5zMy5hbWF6b25hd3MuY29tL2xpYnJhcnktbWVkaWEvODQ4NzI4YzE3MjYwODYwMDk2NTZpbWFnZXMucG5nXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOmRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFwiRGVzY3JpcHRpb25cIiB9KTtcclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6c2l0ZV9uYW1lXCIsIGNvbnRlbnQ6IFwibmF0dXJhbHNcIiB9KTtcclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6dHlwZVwiLCBjb250ZW50OiBcIndlYnNpdGVcIiB9KTtcclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6dXJsXCIsIGNvbnRlbnQ6IFwiaHR0cHM6Ly9uYXR1cmFscy5kZXYuc2ltcG8uYWkvXCIgfSk7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmdldFNjcmVlblNpemUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYnV0dG9uSWQ/OiBzdHJpbmc7XHJcbiAgYnV0dG9uPzogQnV0dG9uTW9kZWxcclxuICBzdHlsZXM/OiBQcm9kdWN0RGVzY1N0eWxlc01vZGFsO1xyXG4gIHN1YkluZHVzdHJ5TmFtZTogc3RyaW5nID0gJydcclxuICBpc0l0ZW1Bc0Zhdm9yaXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBpdGVtSW1hZ2VzOiBJdGVtSW1hZ2VbXSA9IFtdO1xyXG4gIGl0ZW1zOiBNZW51SXRlbVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgYnVzaW5lc3NEZXRhaWxzOiBhbnk7XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLmJ1c2luZXNzRGV0YWlscyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiRGV0YWlscycpXHJcbiAgICAvLyBpZih0aGlzLmJ1c2luZXNzRGV0YWlscyAhPSBudWxsKSB7XHJcbiAgICAvLyAgIHRoaXMuYnVzaW5lc3NEZXRhaWxzID0gSlNPTi5wYXJzZSh0aGlzLmJ1c2luZXNzRGV0YWlscyk7XHJcbiAgICAvLyAgIHRoaXMuc3ViSW5kdXN0cnlOYW1lID0gdGhpcy5idXNpbmVzc0RldGFpbHMuc3ViSW5kdXN0cnlOYW1lO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5nZXRFY29tbWVyY2VDb25maWdzKCk7XHJcbiAgICB0aGlzLnN1YkluZHVzdHJ5TmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdWJJbmR1c3RyeU5hbWUnKSA/PyBcIlwiO1xyXG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcclxuICAgIHRoaXMucmVjZW50Vmlld2VkRGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEsIHRydWUpO1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmxcclxuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnNbMF07XHJcbiAgICB0aGlzLmJ1dHRvbklkID0gKHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5pZCA6ICcnKSArICh0aGlzLmJ1dHRvbiA/IHRoaXMuYnV0dG9uLmlkIDogJycpO1xyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXHJcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvd2lzaGxpc3QnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlUHJvZHVjdCgpO1xyXG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICAgICAgLy8gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnQ29waWVkJywgZGV0YWlsOiAnWW91IGNhbiBzaGFyZSB0aGUgdXJsJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChxUGFyYW0pID0+IHtcclxuICAgICAgY29uc3QgcHJvZHVjdElkID0gcVBhcmFtW1wiaWRcIl07XHJcbiAgICAgIGlmIChwcm9kdWN0SWQpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0RGV0YWlscyhwcm9kdWN0SWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlWzBdO1xyXG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50LCBpZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB2YXJpZW50LnF1YW50aXR5ID0gMDtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKCh2YXJpZW50S2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaWR4ID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFyaWVudC5zZXQodmFyaWVudEtleSwgdmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKTtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudmFyaWVudHMuZ2V0KHZhcmllbnRLZXkpPy5pbmNsdWRlcyh2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV0pKVxyXG4gICAgICAgICAgICAgICAgdGhpcy52YXJpZW50cy5zZXQodmFyaWVudEtleSwgWy4uLih0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KSA/PyBbXSksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XV0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmdldFJlbGF0ZWRQcm9kdWN0cygpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpYW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpYW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXM7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNhcnRSZXNwb25zZS5vbnN1Y2Nlc3MgPSAoY2FydERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQgPSBjYXJ0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQgJiYgaXRlbS52YXJpZW50SWQgPT0gaXRlbVZhcmlhbnQudmFyaWFudElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYXJpYW50LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyV2hpc2hsaXN0KCkudGhlbigod2lzaGxpc3RSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHdpc2hsaXN0UmVzcG9uc2Uub25zdWNjZXNzID0gKHdoaXNsaXN0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB3aGlzbGlzdERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpYW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQgJiYgaXRlbVZhcmlhbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYXJpYW50Lndpc2hsaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsO1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb2R1Y3RCeUNhdGVnb3J5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgdmFyaWVudExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWNlbnRWaWV3SXRlbUxpc3Q6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIGdldFJlbGF0ZWRQcm9kdWN0cygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG4gICAgaWYgKCEhdXNlckRldGFpbHMpIHtcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZWNlbnRWaWV3UHJvZHVjdCh1c2VyRGV0YWlscy51c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLnJlY2VudFZpZXdJdGVtTGlzdCA9IHJlc3BvbnNlO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBzZWxlY3RWYXJpZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnZhcmllbnRMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYXJpZW50LnNldChrZXksIHZhbHVlKTtcclxuICAgIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpID0+IHtcclxuICAgICAgbGV0IGZvdW5kVmFyaWVudCA9IHRydWU7XHJcbiAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGZvdW5kVmFyaWVudCA9ICh0aGlzLnNlbGVjdGVkVmFyaWVudC5nZXQocHJvcGVydHkpID09IHZhcmllbnQucHJvcGVydGllc1twcm9wZXJ0eV0pICYmIGZvdW5kVmFyaWVudDtcclxuICAgICAgfSlcclxuICAgICAgaWYgKGZvdW5kVmFyaWVudCkge1xyXG4gICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHZhcmllbnQudmFyaWFudEltYWdlcztcclxuICAgICAgICB0aGlzLmN1cnJlbnRJbWcgPSB0aGlzLml0ZW1JbWFnZXNbMF0/LmltZ1VybDtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5wcmljZSA9IHZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gdmFyaWVudC5pdGVtSW52ZW50b3J5O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCA9IHZhcmllbnQudmFyaWFudElkO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gdGhpcy5nZXRWYXJpZW50UXVhbnRpdHkodmFyaWVudCk7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdGhpcy5pc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QodmFyaWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy52YXJpZW50TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSwgMzAwKTtcclxuICB9XHJcbiAgZ2V0SXRlbVZhcmllbnQoKTogSXRlbVZhcmlhbnQgfCBudWxsIHtcclxuICAgIGxldCBzZWxlY3RlZFZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IG51bGw7XHJcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KSA9PiB7XHJcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xyXG4gICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChmb3VuZFZhcmllbnQpXHJcbiAgICAgICAgc2VsZWN0ZWRWYXJpZW50ID0gdmFyaWVudDtcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdGVkVmFyaWVudDtcclxuICB9XHJcblxyXG4gIHNoYXJlUHJvZHVjdCgpIHtcclxuICAgIG5hdmlnYXRvci5zaGFyZSh7XHJcbiAgICAgIHRpdGxlOiAnQnV5ICcgKyB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSxcclxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxyXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnUHJvZHVjdCBzaGFyZWQnLCBrZXk6ICd3aXNobGlzdCcgfSkpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdTaGFyZWQnLCBkZXRhaWw6ICdGYWlsZWQgdG8gc2hhcmUgcHJvZHVjdC4gVHJ5IEFnYWluLicsIGtleTogJ3dpc2hsaXN0JyB9KSk7XHJcblxyXG4gIH1cclxuICByb3V0ZVRvSG9tZSgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcclxuICB9XHJcblxyXG4gIHNjcmVlbldpZHRoOiBhbnk7XHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuXHJcbiAgc2Nyb2xsKGU6IFdoZWVsRXZlbnQpIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmQyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBhdFRvcCA9IGQuc2Nyb2xsVG9wID09PSAwO1xyXG4gICAgY29uc3QgYXRCb3R0b20gPSBkLnNjcm9sbFRvcCA+PSBkLnNjcm9sbEhlaWdodCAtIGQuY2xpZW50SGVpZ2h0O1xyXG4gICAgaWYgKChhdFRvcCAmJiBlLmRlbHRhWSA8IDApIHx8IChhdEJvdHRvbSAmJiBlLmRlbHRhWSA+IDApKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGQuc2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZC5zY3JvbGxUb3AgKyBlLmRlbHRhWSAqIDIsIGQuc2Nyb2xsSGVpZ2h0IC0gZC5jbGllbnRIZWlnaHQpKTtcclxuICB9XHJcblxyXG4gIGN1cnJlbnRJbWc6IGFueTtcclxuICBjaGFuZ2VJbWcodXJsOiBhbnkpIHtcclxuICAgIHRoaXMuY3VycmVudEltZyA9IHVybDtcclxuICB9XHJcblxyXG4gIGdldEtleXModmFyaWVudDogT2JqZWN0KTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhcmllbnQpO1xyXG4gIH1cclxuXHJcbiAgZ29Ub0NhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jYXJ0J10pO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9DYXJ0KHR5cGU6ICdBREQnIHwgJ1NVQlNUUkFDVCcgPSAnQUREJykge1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtT3V0T2ZTdG9jaykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnd2FybicsIHN1bW1hcnk6ICdDYXJ0JywgZGV0YWlsOiAnSXRlbSBpcyBub3QgYXZhaWxhYmxlIGFzIG9mIG5vdy4gV2Ugd2lsbCBub3RpZnkgeW91IG9uY2UgYXZhaWxhYmxlJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgaXRlbVZhcmllbnQucXVhbnRpdHkgKz0gKHR5cGUgPT0gJ0FERCcgPyAxIDogLTEpO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbVZhcmllbnQucXVhbnRpdHk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSkge1xyXG4gICAgICAgIGxldCBpc1ByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbS52YXJpZW50SWQgPT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ucXVhbnRpdHkgPSB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eTtcclxuICAgICAgICAgICAgaXNQcmVzZW50ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmICghaXNQcmVzZW50KVxyXG4gICAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LnB1c2gobmV3IE9yZGVyZWRJdGVtcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5VU0VSX0NBUlQgPSB0aGlzLlVTRVJfQ0FSVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IGl0ZW0udmFyaWVudElkICE9IHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkgPz8gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudD8udmFyaWFudElkKTtcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMucmVzcG9uc2VEYXRhPy5xdWFudGl0eSlcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IDA7XHJcbiAgICAgIGlmICh0eXBlID09ICdBREQnKSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgKz0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSAtPSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnb1RvRmlsdGVyKGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2xpc3QnXSwgeyBxdWVyeVBhcmFtczogeyBjYXRlZ29yeTogY2F0ZWdvcnkgfSB9KTtcclxuICB9XHJcblxyXG4gIGFkZFRvRmF2b3VyaXRlKCkge1xyXG4gICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbnZlbnRvcnkgPSBpdGVtVmFyaWVudC5pdGVtSW52ZW50b3J5O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzSXRlbUFzRmF2b3JpdGUpIHtcclxuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXModGhpcy5yZXNwb25zZURhdGEsIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gdGhpcy5VU0VSX1dJU0hMSVNUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSA/PyBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgcmVtb3ZlVG9GYXZvdXJpdGUoKSB7XHJcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSBmYWxzZTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIHJlbW92ZWQgZnJvbSB5b3VyIHdpc2hsaXN0Jywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICBpdGVtVmFyaWVudC53aXNobGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVtb3ZlSXRlbUZyb21GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZW1vdmVJdGVtRnJvbUZhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3RCeUNhdGVnb3J5SWQodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNhdGVnb3JpZXM/LlswXT8ucmVmSWQgPz8gXCJcIikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVsYXRlZFByb2R1Y3REYXRhID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgIT0gcHJvZHVjdC5pdGVtSWQpO1xyXG4gICAgICBpZiAodGhpcy5yZWxhdGVkUHJvZHVjdERhdGE/Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbigpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbigpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbklkKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1Db2xsZWN0aW9uPy5bMF0ucmVmSWQgPz8gXCJcIikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVsYXRlZFByb2R1Y3REYXRhID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgIT0gcHJvZHVjdC5pdGVtSWQpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgY2hhbmdlUHJvZHVjdChwcm9kdWN0OiBQcm9kdWN0KSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9kZXRhaWxzJ10sIHsgcXVlcnlQYXJhbXM6IHsgaWQ6IHByb2R1Y3QuaXRlbUlkIH0gfSk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICB9XHJcbiAgZ2V0S2V5QnlJZHgocHJvcGVydHk6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BlcnR5KVtpbmRleF07XHJcbiAgfVxyXG4gIGlzVmFyaWVudEF2YWlsYWJsZSh2YXJpZW50OiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAvLyB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KT0+IHtcclxuICAgIC8vICAgbGV0IGZvdW5kVmFyaWVudCA9IHRydWU7XHJcbiAgICAvLyAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHk6IHN0cmluZyk9PiB7XHJcbiAgICAvLyAgICAgLy8gZm91bmRWYXJpZW50ID0gKHZhcmllbnRLZXkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gfSlcclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldmlld1RpdGxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHJldmlld0Rlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGFkZFByb2R1Y3RSZXZpZXcoKSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZXZpZXdUaXRsZS5sZW5ndGggPT0gMCAmJiB0aGlzLnJldmlld0Rlc2NyaXB0aW9uLmxlbmd0aCA9PSAwICYmIHRoaXMucHJvZHVjdFJldmlldyA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKCF1c2VyRGV0YWlscykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB0byBwb3N0IHJldmlldycsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGF5bG9hZDogUmV2aWV3ID0ge1xyXG4gICAgICBwcm9kdWN0SWQ6IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCxcclxuICAgICAgdXNlcklkOiB1c2VyRGV0YWlscy51c2VySWQsXHJcbiAgICAgIHJhdGluZzogdGhpcy5wcm9kdWN0UmV2aWV3LFxyXG4gICAgICByZXZpZXc6IHRoaXMucmV2aWV3RGVzY3JpcHRpb24sXHJcbiAgICAgIHVzZXJOYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMucmV2aWV3VGl0bGUsXHJcbiAgICAgIHByb2R1Y3RJbWFnZXM6IFtdXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZFJldmlldyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1JldmlldyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlc3BvbnNlRGF0YS5yYXRpbmcgKz0gMTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiAnVGhhbmtzIGZvciBnaXZpbmcgeW91ciBmZWVkYmFjaycsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgICAgaWYgKHRoaXMucmV2aWV3Q29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdDb21wb25lbnQuZ2V0QWxsUmV2aWV3cygpO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1JldmlldycsIGRldGFpbDogZXJyb3I/LmVycm9yPy5tZXNzYWdlLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYXJpZW50UXVhbnRpdHkocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogbnVtYmVyIHtcclxuICAgIGxldCBpdGVtUXVhbnRpdHk6IG51bWJlciA9IDA7XHJcbiAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXHJcbiAgICAgICAgaXRlbVF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gaXRlbVF1YW50aXR5O1xyXG4gIH1cclxuICBwcml2YXRlIGlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdChwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBib29sZWFuIHtcclxuICAgIGxldCBwcmVzZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKVxyXG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xyXG4gICAgfSlcclxuICAgIHJldHVybiBwcmVzZW50O1xyXG4gIH1cclxuXHJcbiAgZWRpdFNlY3Rpb24oKSB7XHJcblxyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDQ3NSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS50b2dnbGVFZGl0b3JFdmVudC5lbWl0KGZhbHNlKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9ldmVudFNlcnZpY2UuZWRpdFNlY3Rpb24uZW1pdCh7IGRhdGE6IHRoaXMuZGF0YSB9KTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNJdGVtT3V0T2ZTdG9jaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID09IDA7XHJcbiAgfVxyXG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcclxuICB9XHJcbiAgZ2V0IGlzSXRlbUxvd1N0b2NrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPCA1O1xyXG4gIH1cclxuICBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPD0gNDc1O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FyYXQoY2FyYXQ6IGFueSkge1xyXG4gICAgc3dpdGNoIChjYXJhdCkge1xyXG4gICAgICBjYXNlICdLMjQnOlxyXG4gICAgICAgIHJldHVybiBcIjI0IENhcmF0c1wiXHJcbiAgICAgIGNhc2UgJ0syMic6XHJcbiAgICAgICAgcmV0dXJuIFwiMjIgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzE4JzpcclxuICAgICAgICByZXR1cm4gXCIxOCBDYXJhdHNcIlxyXG4gICAgICBjYXNlICdLMTQnOlxyXG4gICAgICAgIHJldHVybiBcIjE0IENhcmF0c1wiXHJcbiAgICAgIGNhc2UgJ0sxMCc6XHJcbiAgICAgICAgcmV0dXJuIFwiMTAgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzk5OSc6XHJcbiAgICAgICAgcmV0dXJuIFwiOTkuOSUgUHVyZVwiXHJcbiAgICAgIGNhc2UgJ0s5MjUnOlxyXG4gICAgICAgIHJldHVybiBcIjkyLjUlIFB1cmVcIlxyXG4gICAgICBjYXNlICdLOTAwJzpcclxuICAgICAgICByZXR1cm4gXCI5MCUgUHVyZVwiXHJcbiAgICAgIGNhc2UgJ1ZTJzpcclxuICAgICAgICByZXR1cm4gXCJWZXJ5IFNsaWdodGx5IEluY2x1ZGVkXCJcclxuICAgICAgY2FzZSAnU0knOlxyXG4gICAgICAgIHJldHVybiBcIlNsaWdodGx5IEluY2x1ZGVkXCJcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIyNCBDYXJhdHNcIlxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRQcmljZVBlckdyYW0od2VpZ2h0OiBhbnksIHByaWNlOiBhbnkpIHtcclxuICAgIGlmICh3ZWlnaHQgJiYgcHJpY2UpIHtcclxuICAgICAgcmV0dXJuIChwcmljZSAvIHdlaWdodCkudG9GaXhlZCgyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuICBpc0Rlc2NyaXB0aW9uQ29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gIHRvZ2dsZURlc2NyaXB0aW9uKCkge1xyXG4gICAgdGhpcy5pc0Rlc2NyaXB0aW9uQ29sbGFwc2VkID0gIXRoaXMuaXNEZXNjcmlwdGlvbkNvbGxhcHNlZDtcclxuICB9XHJcbiAgaXNQcmljZUJyZWFrdXAgPSBmYWxzZVxyXG4gIHRvZ2dsZVByaWNlQnJlYWtEb3duKCkge1xyXG4gICAgdGhpcy5pc1ByaWNlQnJlYWt1cCA9ICF0aGlzLmlzUHJpY2VCcmVha3VwO1xyXG4gIH1cclxuICBnZXREaWZmZXJlbmNlKHNlbGxpbmdQcmljZTogYW55LCBtcnA6IGFueSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gc2VsbGluZ1ByaWNlIC0gbXJwO1xyXG4gIH1cclxuICBnZXRCYWNrZ3JvdW5kQ29sb3IodHlwZTogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBcIkdPTERcIjpcclxuICAgICAgICByZXR1cm4gXCIjRkZGNEQxXCJcclxuICAgICAgY2FzZSBcIkRJQU1PTkRcIjpcclxuICAgICAgICByZXR1cm4gXCIjRUZFMUY0XCJcclxuICAgICAgY2FzZSBcIlNJTFZFUlwiOlxyXG4gICAgICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxODBkZWcsICNGQUZBRkEgMCUsICNGRkZGRkYgMTAwJSlcIlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIiNlMmY2ZmZcIlxyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgZ2V0SGVhZGVyQ29sb3IodHlwZTogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBcIkdPTERcIjpcclxuICAgICAgICByZXR1cm4gXCIjRkRDRDMzXCJcclxuICAgICAgY2FzZSBcIkRJQU1PTkRcIjpcclxuICAgICAgICByZXR1cm4gXCIjOUQ0M0I4XCJcclxuICAgICAgY2FzZSBcIlNJTFZFUlwiOlxyXG4gICAgICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxODBkZWcsICNCREJEQkQgMCUsICNFMkUyRTIgMTAwJSlcIlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxNTlkZWcsIHJnYmEoNjUsMTA1LDIyNSwxKSAwJSwgcmdiYSgxMzcsMjA3LDI0MCwxKSAxMDAlKVwiXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFRleHRDb2xvcihjb2xvcjogYW55KSB7XHJcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChjb2xvci5zbGljZSgzLCA1KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xyXG4gIH1cclxuICBsYW5ndWFnZXM6IHN0cmluZ1tdID0gW1wiRW5nbGlzaFwiLCBcIlRlbHVndVwiLCBcIkhpbmRpXCIsIFwiVGFtaWxcIiwgXCJLYW5uYWRhXCIsIFwiTWFsYXlhbGFtXCIsIFwiT3RoZXJzXCJdXHJcbiAgc2VsZWN0ZWRMYW5nOiBzdHJpbmcgPSB0aGlzLmxhbmd1YWdlc1swXVxyXG5cclxuICBnZXRDbGFzcyhtYXA6IGFueSkge1xyXG4gICAgaWYgKG1hcC5zaXplID09IDEpXHJcbiAgICAgIHJldHVybiAnY29sLTYnXHJcbiAgICBlbHNlIGlmIChtYXAuc2l6ZSA9PSAyKVxyXG4gICAgICByZXR1cm4gJ2NvbC00J1xyXG4gICAgZWxzZSBpZiAobWFwLnNpemUgPT0gMylcclxuICAgICAgcmV0dXJuICdjb2wtMydcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuICd3aWR0aC1tYXgnO1xyXG4gIH1cclxuICBvbkZpbmRJblN0b3JlKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlJ10sIHsgcXVlcnlQYXJhbXM6IHsgc3RvcmVJZDogaWQgfSB9KTtcclxuICB9XHJcblxyXG4gIG9uQm9va0FwcG9pbnRtZW50KCkge1xyXG4gICAgY29uc29sZS5sb2coJ0Jvb2sgYXBwb2ludG1lbnQgY2xpY2tlZCcpO1xyXG4gIH1cclxuICBpc0RldGFpbHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwaW5jb2RlOiBhbnk7XHJcbiAgc3RvcmVEZXRhaWxzOiBhbnk7XHJcbiAgZ2V0U3RvcmVEZXRhaWxzKCkge1xyXG4gICAgaWYgKHRoaXMucGluY29kZSA9PSBudWxsIHx8IHRoaXMucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPSA2KVxyXG4gICAgICByZXR1cm47XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFN0b3JlTG9jYXRvckRldGFpbHModGhpcy5waW5jb2RlLnRvU3RyaW5nKCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pc0RldGFpbHMgPSB0cnVlO1xyXG4gICAgICB0aGlzLnN0b3JlRGV0YWlscyA9IHJlcz8uZGF0YTtcclxuICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ1N0b3JlIExvY2F0b3InIH0pO1xyXG4gICAgICB9KVxyXG4gIH1cclxuICBicmFuZFByb21pc2VzOiBhbnlbXSA9IFtdO1xyXG4gIGVjb21Db25maWdzOiBhbnk7XHJcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RWNvbW1lcmNlQ29uZmlncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5icmFuZFByb21pc2VzID0gcmVzPy5kYXRhPy5icmFuZFByb21pc2VzXHJcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcclxuICAgIH0pXHJcbiAgfVxyXG4gIGxvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG90aGVyTGFuZ3VhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8/IFwiXCIsXHJcbiAgICBtb2JpbGVOdW1iZXI6IFwiXCIsXHJcbiAgICBwaW5jb2RlOiBcIlwiLFxyXG4gICAgdXNlcm5hbWU6IFwiXCIsXHJcbiAgICBtZXNzYWdlOiBgSGksIEkndmUganVzdCBzY2hlZHVsZWQgYSB2aWRlbyBjYWxsIHdpdGggeW91IGZvciB0aGlzIHByb2R1Y3QgJHt0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZX0uIEl0J3MgaW1wb3J0YW50IGFuZCBJJ2QgYXBwcmVjaWF0ZSB5b3VyIHRpbWUg4oCUIGxvb2tpbmcgZm9yd2FyZCB0byBjb25uZWN0aW5nIGFzIHNvb24gYXMgcG9zc2libGVgLFxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGlvbkVycm9yczogYW55ID0ge1xyXG4gICAgdXNlcm5hbWU6IGZhbHNlLFxyXG4gICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgIHBpbmNvZGU6IGZhbHNlXHJcbiAgfTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZVZpZGVvQ2FsbCgpIHtcclxuICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWU/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXIgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyID0gdHJ1ZTtcclxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XHJcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoaGFzRXJyb3JzKSB7XHJcbiAgICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnVzZXJuYW1lPy50cmltKCkgfHwgIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIgfHwgIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcclxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBmaWxsIGFsbCB0aGUgcmVxdWlyZWQgZGV0YWlscycsXHJcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIudG9TdHJpbmcoKS5sZW5ndGggIT09IDEwKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcclxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIDEwLWRpZ2l0IG1vYmlsZSBudW1iZXInLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCA2LWRpZ2l0IHBpbmNvZGUnLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1lc3NhZ2UgPSB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSArIGBpbiAke3RoaXMuc2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnID8gdGhpcy5vdGhlckxhbmd1YWdlIDogdGhpcy5zZWxlY3RlZExhbmd9IGxhbmd1YWdlYDtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UucG9zdFZpZGVvQ2FsbERldGFpbHModGhpcy52aWRlb0NhbGxQYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdZb3VyIFZpZGVvIENhbGwgaXMgU2NoZWR1bGVkIFN1Y2Nlc3NmdWxseScsXHJcbiAgICAgICAgICBrZXk6ICdWaWRlbyBTY2hlZHVsaW5nJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zY2hlZHVsZWQgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ0Vycm9yJyxcclxuICAgICAgICAgIGRldGFpbDogZXJyPy5lcnJvcj8ubWVzc2FnZSxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHJlc2V0VmFsaWRhdGlvbkVycm9ycygpIHtcclxuICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHtcclxuICAgICAgdXNlcm5hbWU6IGZhbHNlLFxyXG4gICAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxyXG4gICAgICBwaW5jb2RlOiBmYWxzZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlc2V0Rm9ybSgpIHtcclxuICAgIHRoaXMudmlkZW9DYWxsUGF5bG9hZCA9IHtcclxuICAgICAgdXNlcm5hbWU6ICcnLFxyXG4gICAgICBtb2JpbGVOdW1iZXI6ICcnLFxyXG4gICAgICBwaW5jb2RlOiAnJyxcclxuICAgICAgbWVzc2FnZTogJydcclxuICAgIH07XHJcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gIH1cclxuICBvbklucHV0Q2hhbmdlKGZpZWxkOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc1tmaWVsZF0gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgY2xvc2VNb2RhbCgpIHtcclxuICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlTW9kYWxDZW50ZXInKTtcclxuICAgIGlmIChtb2RhbEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9kYWxFbGVtZW50LCAnZGF0YS1icy1kaXNtaXNzJywgJ21vZGFsJyk7XHJcbiAgICAgIG1vZGFsRWxlbWVudC5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QnV0dG9uSWQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uaWQgPz8gXCJcIjtcclxuICB9XHJcbiAgZ2V0QnV0dG9uU3R5bGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uc3R5bGVzO1xyXG4gIH1cclxuICBvcGVuZGFpbG9nYm94KHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRGl2RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNjcmVlbldpZHRoID4gNDc1KSB7XHJcbiAgICAgIHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsXHJcbiAgICAgICAgLy8gIHt3aWR0aDonNTAwcHgnfVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHBhbmVsQ2xhc3M6ICd2aWRlby1jYWxsLWRpYWxvZycsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYXREaWFsb2cub3Blbih0ZW1wbGF0ZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB3aWR0aDogJzEwMHZ3JywgLy8gRnVsbCB2aWV3cG9ydCB3aWR0aFxyXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwdmgnLCAvLyBGdWxsIHZpZXdwb3J0IGhlaWdodFxyXG4gICAgICAgICAgbWF4V2lkdGg6ICcxMDB2dycsXHJcbiAgICAgICAgICBwYW5lbENsYXNzOiAnYXBwb2ludG1lbnQtZm9ybSdcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuICBjbG9zZURpYWxvZygpIHtcclxuICAgIHRoaXMubWF0RGlhbG9nLmNsb3NlQWxsKCk7XHJcbiAgfVxyXG5cclxuICBnZXRSYXRpbmdzKG5vb2ZyYXRpbmdzOiBhbnkpIHtcclxuICAgIGlmIChub29mcmF0aW5ncyA+PSAxMDAwKSB7XHJcbiAgICAgIHJldHVybiAobm9vZnJhdGluZ3MgLyAxMDAwKS50b0ZpeGVkKDEpICsgXCJLK1wiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobm9vZnJhdGluZ3MgPiAxMDAwMDAwKSB7XHJcbiAgICAgIHJldHVybiAobm9vZnJhdGluZ3MgLyAxMDAwMDAwKS50b0ZpeGVkKDEpICsgXCJNXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5vb2ZyYXRpbmdzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIndpc2hsaXN0XCJcclxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuICA8c2VjdGlvbiBjbGFzcz1cInRvdGFsLWNvbnRhaW5lclwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0xheW91dF09XCJzdHlsZXM/LmxheW91dFwiIFtzaW1wb0JhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCJcclxuICAgIHNpbXBvSG92ZXIgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW2F0dHIuc3R5bGVdPVwiY3VzdG9tQ2xhc3NcIj5cclxuXHJcbiAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cclxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCIgW2J1dHRvblN0eWxlXT1cInsnYm9yZGVyLXJhZGl1cyc6ICc1MCUnLCAnaGVpZ2h0JzogJzMwcHgnfVwiIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwiY29udGFpbmVyIHAtMFwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1ub25lXCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogIzAyNjdDMVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicm91dGVUb0hvbWUoKVwiPkhvbWU8L2E+IC9cclxuICAgICAgICA8c3Bhbj57eyByZXNwb25zZURhdGE/Lm5hbWUgfCB0aXRsZWNhc2UgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGgtMTAwXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNXB4O1wiIGNsYXNzPVwiYWJvdmUtaGVpZ2h0XCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J21pbi1oZWlnaHQ6IDk1dmgnOiBpc01vYmlsZSwgJ21heC13aWR0aDogOTV2aCc6ICFpc01vYmlsZX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLTEyIGgtMTAwXCIgY2xhc3M9XCJoZWlnaHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kLWltZy1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiSW1hZ2VTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTQgY29sLTEyIGgtMTAwIHByb2R1Y3QtZGV0YWlsXCIgI2QyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YXJpYW50c1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlByb2R1Y3REZXNjXCI+PC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhcmlhbnRzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc01vYmlsZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiQWN0aW9uQnRuXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkRlbGl2ZXJ5U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpZGVvQ2FsbFNjaGVkdWxlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnJhbmRpbmdcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlc2NyaXB0b3JzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2MgYm9keS1sYXJnZSBkLWJsb2NrXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1za3VcIj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5XCI+U0tVIDoge3tyZXNwb25zZURhdGEuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrfX08L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcyAmJiAocmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzPy5sZW5ndGggfHwgMCkgPiAwXCI+XHJcbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgOiA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cImdvVG9GaWx0ZXIoY2F0LnJlZk5hbWUpXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXQgb2YgcmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzO2xldCBpZHggPSBpbmRleFwiPnt7Y2F0LnJlZk5hbWUgfFxyXG4gICAgICAgICAgICAgICAgdGl0bGVjYXNlfX0gPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIihpZHgrMSkgIT0gcmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzPy5sZW5ndGhcIj4sPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKHJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5wcm9kdWN0VGFncz8ubGVuZ3RoIHx8IDApID4gMFwiPlRhZ3MgOiA8c3BhblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHRhZyBvZiByZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8ucHJvZHVjdFRhZ3NcIj57e3RhZy50YWdOYW1lfX0sXHJcbiAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJTb2NpYWxJY29uc1wiPjwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlJldmlld1NlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVsYXRlZFByb2R1Y3REYXRhPy5sZW5ndGhcIj5cclxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwiZmVhdHVyZVByb2R1Y3REYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWxhdGVkUHJvZHVjdERhdGFcIlxyXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIiAoY2hhbmdlRGV0YWlsUHJvZHVjdCk9XCJjaGFuZ2VQcm9kdWN0KCRldmVudClcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjZW50Vmlld0l0ZW1MaXN0Py5sZW5ndGhcIj5cclxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwicmVjZW50Vmlld2VkRGF0YVwiIFtyZXNwb25zZURhdGFdPVwicmVjZW50Vmlld0l0ZW1MaXN0XCJcclxuICAgICAgICBbaXNSZWxhdGVkUHJvZHVjdF09XCJ0cnVlXCI+PC9zaW1wby1mZWF0dXJlZC1wcm9kdWN0cz5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPCEtLSA8bmctY29udGFpbmVyPlxyXG4gICAgICA8c2ltcG8tY3VzdG9tZXItcmV2aWV3IFtkYXRhXT1cImRhdGFcIj48L3NpbXBvLWN1c3RvbWVyLXJldmlldz5cclxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy5kZXZpZGVyPy5kaXNwbGF5XCI+XHJcbiAgICAgIDxzaW1wby1zdmctZGl2aWRlciBbZGl2aWRlclR5cGVdPVwic3R5bGVzPy5kZXZpZGVyPy5kZXZpZGVyVHlwZVwiXHJcbiAgICAgICAgW2NvbG9yXT1cIm5leHRDb21wb25lbnRDb2xvcj8uY29sb3JcIj48L3NpbXBvLXN2Zy1kaXZpZGVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XHJcbiAgICAgIDxzaW1wby1ob3Zlci1lbGVtZW50cyBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCIgW2VkaXRPcHRpb25zXT1cImVkaXRcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxyXG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbjxuZ3gtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgY291bnQ9XCIxXCIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XHJcbiAgd2lkdGg6ICcxMDAlJyxcclxuICBoZWlnaHQ6ICc0MHZoJyxcclxuICAnYm9yZGVyLXJhZGl1cyc6ICcxMHB4JyxcclxuICAncG9zaXRpb24nOiAncmVsYXRpdmUnLFxyXG4gICdyaWdodCc6ICc1cHgnXHJcbn1cIj5cclxuPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2JpbGUtZm9vdGVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImljb25zXCI+XHJcbiAgICA8ZGl2IChjbGljayk9XCJnb1RvQ2FydCgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cImFkZFRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiIWlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZV9ib3JkZXI8L21hdC1pY29uPlxyXG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwicmVtb3ZlVG9GYXZvdXJpdGUoKVwiXHJcbiAgICAgICAgKm5nSWY9XCJpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cIm91dC1vZi1zdG9ja1wiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiPk91dCBvZiBTdG9jazwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9ja1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBsdXNcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KCdTVUJTVFJBQ1QnKVwiPi08L2Rpdj5cclxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+e3tyZXNwb25zZURhdGEucXVhbnRpdHl9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbnVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnQUREJylcIj4rPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxyXG4gICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgpXCJcclxuICAgICpuZ0lmPVwiIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbH19PC9idXR0b24+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNSZXZpZXdTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5DdXN0b21lciBSZXZpZXc8L2Rpdj5cclxuICAgIDxwLXJhdGluZyBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRvdGFsUmV2aWV3XCIgLz5cclxuICAgIDxzcGFuPkJlIHRoZSBmaXJzdCB0byB3cml0ZSBhIHJldmlldzwvc3Bhbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJtdC0zXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9ICFzaG93UmV2aWV3XCI+e3sgIXNob3dSZXZpZXcgPyAnQWRkXHJcbiAgICAgIFJldmlldycgOiAnQ2FuY2VsIFJldmlldyd9fTwvYnV0dG9uPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZXZpZXdcIj5cclxuICAgICAgPGhyIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXJldmlld1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPldyaXRlIGEgcmV2aWV3PC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJBVElORzwvc3Bhbj5cclxuICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJwcm9kdWN0UmV2aWV3XCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJmYWxzZVwiIC8+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXcgVGl0bGU8L3NwYW4+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkdpdmUgeW91ciByZXZpZXcgYSB0aXRsZVwiIFsobmdNb2RlbCldPVwicmV2aWV3VGl0bGVcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldzwvc3Bhbj5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgY29tbWVudHMgaGVyZVwiIFsobmdNb2RlbCldPVwicmV2aWV3RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctYWN0aW9uLWJ0blwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInNob3dSZXZpZXcgPSBmYWxzZVwiPkNhbmNlbCByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZFByb2R1Y3RSZXZpZXcoKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcm9kdWN0UmV2aWV3ID09IDAgJiYgcmV2aWV3VGl0bGU/Lmxlbmd0aCA9PSAwICYmIHJldmlld0Rlc2NyaXB0aW9uPy5sZW5ndGggPT0gMFwiPlN1Ym1pdFxyXG4gICAgICAgICAgICByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNTb2NpYWxJY29ucz5cclxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGFsaWduLWl0ZW1zLWxnLWNlbnRlciBmbGV4LWNvbHVtbiBmbGV4LWxnLXJvdyBnYXAtbGctMCBnYXAtM1wiXHJcbiAgICAgIFtuZ0NsYXNzXT1cImRhdGE/LmNvbnRlbnQ/LnNvY2lhbExpbmtzPy5kaXNwbGF5ID8gJ2p1c3RpZnktY29udGVudC1iZXR3ZWVuJyA6ICdqdXN0aWZ5LWNvbnRlbnQtZW5kJ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTBcIiAqbmdJZj1cImRhdGE/LmNvbnRlbnQ/LnNvY2lhbExpbmtzPy5kaXNwbGF5XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uY2hhbm5lbHNcIj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7bWFyZ2luLXJpZ2h0OiAxMHB4O1wiPlxyXG4gICAgICAgICAgICA8c2ltcG8tc29jaWEtaWNvbnMgW3NvY2lhbEljb25EYXRhXT1cIml0ZW1cIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiPjwvc2ltcG8tc29jaWEtaWNvbnM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjQWN0aW9uQnRuPlxyXG4gIDxkaXYgY2xhc3M9XCJidXR0b24tcGFyZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwib3V0LW9mLXN0b2NrIHRleHQtY2VudGVyXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrXCJcclxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5PdXQgb2ZcclxuICAgICAgU3RvY2s8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIlxyXG4gICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZjXCJcclxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7cmVzcG9uc2VEYXRhLnF1YW50aXR5fX08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1pbnVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnQUREJylcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPis8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCIgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiXHJcbiAgICAgIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cIm9wZW5kYWlsb2dib3goZGlhbG9nQm94KVwiPlxyXG4gICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxyXG4gICAgPGRpdiAqbmdJZj1cIiFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrXCIgY2xhc3M9XCJ3LTc1XCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtpZF09XCJidXR0b25JZFwiIFtidXR0b25TdHlsZV09XCJidXR0b24/LnN0eWxlc1wiXHJcbiAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAoY2xpY2spPVwiYWRkVG9DYXJ0KClcIj48bWF0LWljb24+c2hvcHBpbmdfY2FydDwvbWF0LWljb24+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmF2b3VyaXRlIGJvcmRlci1zb2xpZFwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0Zhdm91cml0ZSgpXCJcclxuICAgICAgICAqbmdJZj1cIiFpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGVfYm9yZGVyPC9tYXQtaWNvbj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInJlbW92ZVRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoYXJlLXByb2R1Y3RcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2hhcmUtaWNvblwiIChjbGljayk9XCJzaGFyZVByb2R1Y3QoKVwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnNoYXJlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN2YXJpYW50cz5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uc3R5bGVzPy5jdXN0b21pemF0aW9uID09ICdTdHlsZTEnXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpZW50IG9mIHZhcmllbnRzIHwga2V5dmFsdWVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE1XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQta2V5XCI+e3t2YXJpZW50LmtleX19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YXJpZW50VmFsdWUgb2YgdmFyaWVudC52YWx1ZVwiIGNsYXNzPVwidmFyaWVudC10YWdcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gJ3doaXRlJyA6IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWYXJpZW50KHZhcmllbnQua2V5LCB2YXJpZW50VmFsdWUpXCI+e3t2YXJpZW50VmFsdWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5zdHlsZXM/LmN1c3RvbWl6YXRpb24gPT0gJ1N0eWxlMicgJiYgc2VsZWN0ZWRWYXJpZW50LnNpemUgPiAwXCI+XHJcbiAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTIgc3R5bGUyLWNvbnRhaW5lciB3LTEwMFwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZFZhcmllbnQgfCBrZXl2YWx1ZVwiIGNsYXNzPVwicHgtMyBweS0yIHZhcmllbnQtaXRlbVwiXHJcbiAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q2xhc3Moc2VsZWN0ZWRWYXJpZW50KVwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFyaWFudC1oZWFkXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57e2l0ZW0ua2V5IHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpYW50LXZhbHVlIHRleHQtc3RhcnQgZnctNjAwXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICAgICAge3tpdGVtLnZhbHVlIHxcclxuICAgICAgICAgICAgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgcC0wXCIgW2NsYXNzXT1cImdldENsYXNzKHNlbGVjdGVkVmFyaWVudClcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGV4dCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDAgcC0yXCIgZGF0YS1icy10b2dnbGU9XCJvZmZjYW52YXNcIlxyXG4gICAgICAgICAgICBkYXRhLWJzLXRhcmdldD1cIiNvZmZjYW52YXNSaWdodFZhcmlhbnRcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKVwiPkNVU1RPTUlTRVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI1Byb2R1Y3REZXNjPlxyXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE1cHg7XCJcclxuICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5hdmVyYWdlUmF0aW5nICAmJiByZXNwb25zZURhdGE/LnRvdGFsUmV2aWV3Q291bnRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyYXRpbmcgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTJcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicmF0aW5nLW5vIG15LTFcIj57e1wi4q2QXCIgKyAocmVzcG9uc2VEYXRhPy5hdmVyYWdlUmF0aW5nIHwgbnVtYmVyOicxLjEtMicpfX08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLXJhdGluZ3MgbXktMVwiPnt7cmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50ID09IDEgPyAnMSBSYXRpbmcnIDpcclxuICAgICAgICBnZXRSYXRpbmdzKHJlc3BvbnNlRGF0YT8udG90YWxSZXZpZXdDb3VudCkgKyBcIiBcIiArIFwicmF0aW5nc1wifX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCIgW25nQ2xhc3NdPVwieydkaXNjb3VudC1wcmljZSc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIlxyXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlICYmIHJlc3BvbnNlRGF0YS5wcmljZS5kaXNjb3VudGVkUHJpY2UgPiAwXCI+PHNwYW5cclxuICAgICAgICAgIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxyXG4gICAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfX08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCIgW25nQ2xhc3NdPVwieydzdHJpa2UtdGhyb3VnaCc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIlxyXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlICYmIGdldERpZmZlcmVuY2UocmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlLCByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UpID4gMlwiPlxyXG4gICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxyXG4gICAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjAtMCd9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRheC10ZXh0XCI+KE1SUCBJbmNsdXNpdmUgYWxsIHRheGVzKTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkaW5nLWxhcmdlIHRyaW0tdGV4dFwiIGNsYXNzPVwicHJvZHVjdC1oZWFkaW5nXCI+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2MgYm9keS1sYXJnZSBkLWJsb2NrXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCIgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Rlc2NyaXB0b3JzPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgcHJvZC1kZXNjXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRleHRcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvciB8fCByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlByb2R1Y3QgRGV0YWlsczwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2VicmVha3VwLWJ0biBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzdWJJbmR1c3RyeU5hbWUgPT0gJ0Vjb21tZXJjZSBKZXdlbGxlcnknXCIgZGF0YS1icy10b2dnbGU9XCJvZmZjYW52YXNcIlxyXG4gICAgICAgICAgZGF0YS1icy10YXJnZXQ9XCIjb2ZmY2FudmFzUmlnaHRQcmljZUJyZWFrdXBcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRUZXh0Q29sb3IoZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcilcIj5cclxuICAgICAgICAgICsgUFJJQ0UgQlJFQUtVUFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgY2xhc3M9XCJib2R5LWxhcmdlIGJyaWVmLWRlc2NcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvclwiXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uY29sb3JcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJJbmR1c3RyeU5hbWUgPT0gJ0Vjb21tZXJjZSBKZXdlbGxlcnknXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImpld2VsbGVyeS10YWJsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtY29udGFpbmVyIG10LTJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtaGVhZGVyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0SGVhZGVyQ29sb3IoZWxlLm1hdGVyaWFsVHlwZSlcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImVsZS5tYXRlcmlhbFR5cGUgPT0gJ0RJQU1PTkQnID8gJyNmZmYnIDogJydcIj5cclxuICAgICAgICAgICAgICAgIHt7ZWxlLm1hdGVyaWFsVHlwZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgTmV0IFdlaWdodC9HcmFtXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2VsZS5wcmltYXJ5TWF0ZXJpYWxXZWlnaHQgKyBcIiBcIiArICdncmFtcyd9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUHVyaXR5XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2VsZS5tYXRlcmlhbFB1cml0eX19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFByaWNlL0dyYW1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuXt7IGdldFByaWNlUGVyR3JhbShlbGUucHJpbWFyeU1hdGVyaWFsV2VpZ2h0LGVsZS5tYXRlcmlhbFByaWNlKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOicxLjItMid9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVmFsdWVcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuXt7ZWxlLm1hdGVyaWFsUHJpY2UgfCBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiamV3ZWwtY29udGFpbmVyIG10LTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImpld2VsLWhlYWRlclwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEhlYWRlckNvbG9yKCdNYWtpbmcgQ2hhcmdlcycpXCI+XHJcbiAgICAgICAgICAgICAgTWFraW5nIENoYXJnZXNcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0wIHctMTAwIGJyLXBcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCYWNrZ3JvdW5kQ29sb3IoJ01ha2luZyBDaGFyZ2VzJylcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIE5ldCBXZWlnaHRcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVzcG9uc2VEYXRhPy5iYXNlV2VpZ2h0fX0gPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICBNYWtpbmcgQ2hhcmdlICVcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVzcG9uc2VEYXRhPy5tYWtpbmdDaGFyZ2VQZXJjZW50YWdlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgVmFsdWVcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgIOKCuXt7cmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy5tYWtpbmdDaGFyZ2VBbW91bnQgfCBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDwhLS0gPGRpdiBjbGFzcz1cInRhYi1ncm91cFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBocmVmPVwiI2NvbGxhcHNlRXhhbXBsZVwiID5EZXNjcmlwdGlvbjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiIGNsYXNzPVwiYm9keS1sYXJnZSBjb2xsYXBzZVwiIGlkPVwiY29sbGFwc2VFeGFtcGxlXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3JcIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3I/Lm5hbWVcIj48L2Rpdj4gLS0+XHJcbiAgPC9kaXY+XHJcblxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNJbWFnZVNlY3Rpb24+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpZW50TG9hZGluZyAmJiBkYXRhPy5zdHlsZXM/LmdyaWRTdHlsZSA9PSAnU3R5bGUxJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImltZy1saXN0XCIgKm5nSWY9XCJzY3JlZW5XaWR0aCA+IDUwMFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlc1wiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgW3NyY109XCJpbWcuaW1nVXJsXCJcclxuICAgICAgICAgIGFsdD1cIlwiIGNsYXNzPVwiaW1nXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAod2hlZWwpPVwic2Nyb2xsKCRldmVudClcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRJbWdcIj5cclxuXHJcbiAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJzaGFyZS1pY29uXCIgKGNsaWNrKT1cInNoYXJlUHJvZHVjdCgpXCI+c2hhcmU8L21hdC1pY29uPiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTW9iaWxlXCI+XHJcbiAgICAgICAgICA8aW1nIFtzcmNdPVwiY3VycmVudEltZ1wiIGNsYXNzPVwiaW1nIHpvb21cIiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7XCIgW3NpbXBvQ29ybmVyXT1cInN0eWxlcz8uY29ybmVyc1wiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc01vYmlsZVwiPlxyXG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIFtzcmNdPVwiY3VycmVudEltZ1wiIGFsdD1cIlwiIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIiBjbGFzcz1cInpvb21cIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VycmVudEltZ1wiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCIgYWx0PVwiXCJcclxuICAgICAgICAgIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJpbWctbGlzdCB3LTEwMFwiICpuZ0lmPVwic2NyZWVuV2lkdGggPD0gNTAwXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIiBbc3JjXT1cImltZy5pbWdVcmxcIlxyXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJpbWcgem9vbVwiIChjbGljayk9XCJjaGFuZ2VJbWcoaW1nLmltZ1VybClcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFyaWVudExvYWRpbmcgJiYgZGF0YT8uc3R5bGVzPy5ncmlkU3R5bGUgPT0gJ1N0eWxlMidcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgaC0xMDAgb3ZlcmZsb3ctc2Nyb2xsIG10LTAgdy0xMDBcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1JbWFnZXM/Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIiBhbHQ9XCJcIiBjbGFzcz1cImltZ1wiXHJcbiAgICAgICAgICBbc2ltcG9Db3JuZXJdPVwic3R5bGVzPy5jb3JuZXJzXCIgY2xhc3M9XCJjb2wtMTIgaC0xMDAgcC0wXCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlc1wiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgW3NyY109XCJpbWcuaW1nVXJsXCJcclxuICAgICAgICAgIGFsdD1cIlwiIGNsYXNzPVwiaW1nIGNvbC02IGgtNzUgcC0xXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCJcclxuICAgICAgICAgIFtjbGFzcy5oLTEwMF09XCJzY3JlZW5XaWR0aCA8PSA1MDBcIiBbY2xhc3Mudy0xMDBdPVwiaXRlbUltYWdlcz8ubGVuZ3RoID09IDFcIlxyXG4gICAgICAgICAgW2NsYXNzLmgtMTAwXT1cIml0ZW1JbWFnZXM/Lmxlbmd0aCA9PSAxXCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAqbmdJZj1cInZhcmllbnRMb2FkaW5nXCI+XHJcbiAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzEwcHgnLFxyXG4gICAgICAncG9zaXRpb24nOiAncmVsYXRpdmUnLFxyXG4gICAgICAncmlnaHQnOiAnNXB4J1xyXG4gICAgfVwiPlxyXG4gICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNicmFuZGluZz5cclxuICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBicmFuZCBvZiBicmFuZFByb21pc2VzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGctMlwiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcclxuICAgICAgICAgIFtzcmNdPVwiYnJhbmQ/LmxvZ29VcmxcIiBhbHQ9XCJcIiBjbGFzcz1cInctaC00MCBwLTAgYnItNTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtdGV4dCB3LTEwMCB0ZXh0LWNlbnRlciBweS0yXCI+XHJcbiAgICAgICAgICB7e2JyYW5kPy50aXRsZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3ZpZGVvQ2FsbFNjaGVkdWxlPlxyXG4gIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8udmlkZW9DYWxsRW5hYmxlZFwiIC0tPlxyXG4gIDxuZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHZpZGVvLWNvbnRhaW5lclwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxyXG4gICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8yNzUzNTRjMTc1MDgzNTA5NjQ3MUFuaW1hdGlvbiAtIDE3NTA4MzUwMDEyMjAuZ2lmXCJcclxuICAgICAgICAgIGFsdD1cIlwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGFsaWduLWNvbnRlbnQtY2VudGVyXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8taGVhZC10ZXh0XCI+XHJcbiAgICAgICAgICBMaXZlIFZpZGVvIENhbGxcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHRcIj5cclxuICAgICAgICAgIEpvaW4gYSBsaXZlIHZpZGVvIGNhbGwgd2l0aCBvdXIgY29uc3VsdGFudHMgdG8gc2VlIHlvdXIgZmF2b3VyaXRlIGRlc2lnbnMgdXAgY2xvc2UhXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjaC1idG4gdGV4dC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuZGFpbG9nYm94KGRpYWxvZ0JveClcIj5cclxuICAgICAgICAgIFNjaGVkdWxlIGEgVmlkZW8gQ2FsbFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNEZWxpdmVyeVNlY3Rpb24+XHJcbiAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LWNvbnRhaW5lclwiPlxyXG4gICAgPGgyIGNsYXNzPVwiZGVsaXZlcnktdGl0bGVcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPkRlbGl2ZXJ5LCBTdG9yZXMgJiBUcmlhbDwvaDI+XHJcblxyXG4gICAgPCEtLSBMb2NhdGlvbiBTZWN0aW9uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLXNlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgdy05MFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBteC0xXCI+PG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInBvc3RhbC1jb2RlLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJQaW4gQ29kZVwiIFsobmdNb2RlbCldPVwicGluY29kZVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gbG9jYXRlLWJ0blwiIChjbGljayk9XCJnZXRTdG9yZURldGFpbHMoKVwiPlN1Ym1pdDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGV0YWlsc1wiPlxyXG4gICAgICA8IS0tIEZyZWUgRGVsaXZlcnkgU2VjdGlvbiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS1pY29uXCI+8J+OgTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LXRleHRcIiAqbmdJZj1cImVjb21Db25maWdzPy5kZWxpdmVyeUNoYXJnZXMgPT0gMFwiPkZyZWVcclxuICAgICAgICAgICAgRGVsaXZlcnkgYnkge3sgc3RvcmVEZXRhaWxzPy5lc3RpbWF0ZWREZWxpdmVyeURhdGUgfCBkYXRlOidkIE1NTScgfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlDaGFyZ2VzID4gMFwiPllvdXJcclxuICAgICAgICAgICAgT3JkZXIgd2lsbFxyXG4gICAgICAgICAgICBEZWxpdmVyIGJ5IHt7IHN0b3JlRGV0YWlscz8uZXN0aW1hdGVkRGVsaXZlcnlEYXRlIHwgZGF0ZTonZCBNTU0nIH19IHdpdGggYSBEZWxpdmVyeSBDaGFyZ2Ugb2ZcclxuICAgICAgICAgICAg4oK5IHt7ZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyB8IG51bWJlcjonMS4yLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBOZWFyZXN0IFN0b3JlIFNlY3Rpb24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBzdG9yZS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWljb25cIj7wn4+qPC9zcGFuPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLXRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWxhYmVsXCI+TmVhcmVzdCBTdG9yZSAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLW5hbWVcIj57eyBzdG9yZURldGFpbHM/Lm5lYXJieVN0b3JlPy5uYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInN0b3JlLWRpc3RhbmNlXCI+ICg0a20pPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImF2YWlsYWJpbGl0eS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmFpbGFiaWxpdHktYmFkZ2VcIj7ij7AgQVZBSUxBQkxFIEJZIDI4IEpVTjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJvdGhlci1zdG9yZXMtdGV4dFwiPlxyXG4gICAgICAgICAgICAgIEFsc28gQXZhaWxhYmxlIGluIDxzcGFuIGNsYXNzPVwib3RoZXItc3RvcmVzLWxpbmtcIj4xOCBvdGhlciBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbmQtc3RvcmUtYnRuXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDIpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDIpXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgyKVwiIChjbGljayk9XCJvbkZpbmRJblN0b3JlKHN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LnN0b3JlSWQpXCI+RklORCBJTlxyXG4gICAgICAgICAgICBTVE9SRTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gVHJ5IEF0IEhvbWUgU2VjdGlvbiAtLT5cclxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwidHJ5LWhvbWUtc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgdHJ5LWhvbWUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJob21lLWljb25cIj7wn4+gPC9zcGFuPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1ob21lLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1ob21lLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJ5LWhvbWUtdGV4dFwiPlRyeSBBdCBIb21lPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnJlZS10ZXh0XCI+IChJdCdzIEZyZWUpPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LXRleHRcIj5cclxuICAgICAgICAgICAgICBIb21lIEFwcG9pbnRtZW50IDxzcGFuIGNsYXNzPVwiYXBwb2ludG1lbnQtYXZhaWxhYmxlXCI+QXZhaWxhYmxlIHRvIHRyeSBmcm9tIDI4IEp1bjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4LWFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYm9vay1hcHBvaW50bWVudC1idG5cIj5CT09LIEhPTUUgQVBQT0lOVE1FTlQ8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cIm9mZmNhbnZhcyBvZmZjYW52YXMtZW5kIG9mZmNhbnZhcy12YXJpYW50XCIgdGFiaW5kZXg9XCItMVwiIGlkPVwib2ZmY2FudmFzUmlnaHRWYXJpYW50XCJcclxuICBhcmlhLWxhYmVsbGVkYnk9XCJvZmZjYW52YXNSaWdodExhYmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmLTE4XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHB4LTMgcGItMlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInByaWNlLXRleHRcIj5QcmljZTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCAgZy0zIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIiBbbmdDbGFzc109XCJ7J2Rpc2NvdW50LXByaWNlJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiXHJcbiAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgJiYgcmVzcG9uc2VEYXRhLnByaWNlLmRpc2NvdW50ZWRQcmljZSA+IDBcIj48c3BhblxyXG4gICAgICAgICAgW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9fTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIlxyXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlICYmIGdldERpZmZlcmVuY2UocmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlLCByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UpID4gMlwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydzdHJpa2UtdGhyb3VnaCc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIj48c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4wLTAnfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWNvbnRhaW5lciBoLTEwMCBwLTNcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmFyaWVudC1rZXlcIj57e3ZhcmllbnQua2V5fX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgc3R5bGU9XCJnYXA6IDVweDtcIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhcmllbnRWYWx1ZSBvZiB2YXJpZW50LnZhbHVlXCIgY2xhc3M9XCJ2YXJpZW50LXRhZ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyAnd2hpdGUnIDogZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQodmFyaWVudC5rZXksIHZhcmllbnRWYWx1ZSlcIj57e3ZhcmllbnRWYWx1ZSB8IHRpdGxlY2FzZX19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbmZpcm0tYnRuIHctMTAwIHAtMyB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIGRhdGEtYnMtZGlzbWlzcz1cIm9mZmNhbnZhc1wiXHJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgc3R5bGU9XCJjb2xvcjogd2hpdGU7XCI+Q29uZmlybVxyXG4gICAgQ3VzdG9taXphdGlvbjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nQm94PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLWhlYWRlciB3LTEwMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1lbmQgcC0yXCI+XHJcbiAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiXHJcbiAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZi0xOFwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nLXZpZGVvIHctMTAwIHB5LTIgdGV4dC1jZW50ZXJcIj5MaXZlIFZpZGVvIGNhbGwgYXQgeW91ciBjb252ZW5pZW5jZSE8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBoLTEwMCBwLTBcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaC0xMDAgdy0xMDAgbXQtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzYwMzc4MmMxNzUwOTI1OTk1NzY1QW5pbWF0aW9uIC0gMTc1MDkyNTk0NzYxOC5naWZcIlxyXG4gICAgICAgICAgICBhbHQ9XCJcIiBjbGFzcz1cImgtMTAwIHctMTAwXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHBvc2l0aW9uLXJlbGF0aXZlIGgtMTAwXCI+XHJcblxyXG4gICAgICAgICAgPCEtLSBOYW1lIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnVzZXJuYW1lXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgTmFtZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWVcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCd1c2VybmFtZScpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBOdW1iZXIgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsXCI+SU4gKzkxPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBNb2JpbGUqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlclwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ21vYmlsZU51bWJlcicpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIFBpbmNvZGUgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMucGluY29kZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHQtY2FsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEyIGJvcmRlci11bnNldFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImYtMTggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW4gQ29kZSpcIiBjbGFzcz1cInctODhcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQucGluY29kZVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ3BpbmNvZGUnKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10ZXh0IG1iLTJcIj5MYW5ndWFnZSBQcmVmZXJlbmNlPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1jb250YWluZXIgZC1mbGV4IGdhcC0yIGZsZXgtd3JhcCBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5nIHB4LTIgcHktMSByb3VuZGVkIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGFuZyA9PSBzZWxlY3RlZExhbmcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRMYW5nID0gbGFuZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJsYW5nID09IHNlbGVjdGVkTGFuZyA/IGdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKSA6ICcjMDAwMDAwJ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7e2xhbmd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPdGhlciBMYW5ndWFnZVwiIFsobmdNb2RlbCldPVwib3RoZXJMYW5ndWFnZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInZpZGVvLWJ0biBtdC0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIChjbGljayk9XCJzY2hlZHVsZVZpZGVvQ2FsbCgpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdWJtaXR0aW5nXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIG1lLTJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgU0NIRURVTElORy4uLlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1N1Ym1pdHRpbmcgJiYgIXNjaGVkdWxlZFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj52aWRlb19jYWxsPC9tYXQtaWNvbj4mbmJzcDtcclxuICAgICAgICAgICAgICBTQ0hFRFVMRSBBIFZJREVPIENBTExcclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzY2hlZHVsZWRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj4mbmJzcDtcclxuICAgICAgICAgICAgICBTQ0hFRFVMRUQgU1VDQ0VTU0ZVTExZXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwib2ZmY2FudmFzIG9mZmNhbnZhcy1lbmQgb2ZmY2FudmFzLXNtYWxsIG92ZXJmbG93LXNjcm9sbFwiIHRhYmluZGV4PVwiLTFcIiBpZD1cIm9mZmNhbnZhc1JpZ2h0UHJpY2VCcmVha3VwXCI+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTEwLTIwXCI+XHJcbiAgICA8bWF0LWljb24gZGF0YS1icy1kaXNtaXNzPVwib2ZmY2FudmFzXCJcclxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZi0xOFwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1wcmljZSBwLTEwLTIwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnJlYWstaGVhZGVyXCI+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJwcmljZS1icmVha3VwIGgtMTAwIHctMTAwXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlLWNvbnRhaW5lciBtYi0zIHAtMTAtMjBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtY29udGFpbmVyLWhlYWRlclwiPlxyXG4gICAgICAgICAge3sgZWxlLm1hdGVyaWFsVHlwZSArIFwiIEJSRUFLVVBcIiB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgaGVhZGVyLXJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+Q09NUE9ORU5UPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5SQVRFPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5XRUlHSFQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPkZJTkFMIFZBTFVFPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCB2YWx1ZS1yb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPnt7IGVsZS5tYXRlcmlhbFB1cml0eSB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+4oK5e3sgZ2V0UHJpY2VQZXJHcmFtKGVsZS5wcmltYXJ5TWF0ZXJpYWxXZWlnaHQsIGVsZS5tYXRlcmlhbFByaWNlKSB8IG51bWJlcjonMS4yLTInIH19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj57eyBlbGUucHJpbWFyeU1hdGVyaWFsV2VpZ2h0ICsgXCIgZ3JhbXNcIiB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRvdGFsXCI+4oK5e3sgZWxlLm1hdGVyaWFsUHJpY2UgfCBudW1iZXI6JzEuMi0yJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXIgbWItMyBwLTEwLTMwIHB5LTAgYm9yZGVyLXVuc2V0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgc3VtbWFyeS1yb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1zdGFydFwiPk1ha2luZyBDaGFyZ2VzPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtZW5kIHRvdGFsXCI+4oK5e3sgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy5tYWtpbmdDaGFyZ2VBbW91bnQgfCBudW1iZXI6JzEuMi0yJyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+VGF4IEFtb3VudDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LWVuZCB0b3RhbFwiPuKCuXt7IHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8udGF4QW1vdW50IHwgbnVtYmVyOicxLjItMicgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgc3VtbWFyeS1yb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1zdGFydFwiPlRvdGFsIEFtb3VudDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LWVuZCB0b3RhbFwiPlxyXG4gICAgICAgICAg4oK5e3socmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy5wcmljZVdpdGhvdXRUYXggKyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnRheEFtb3VudCkgfFxyXG4gICAgICAgICAgbnVtYmVyOicxLjItMid9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+Il19
|
797
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBMEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25JLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFekYsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBTWpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQVksY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSXZELE9BQU8sRUFBa0Isb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNuRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DbkYsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFdBQVc7SUF3Qm5ELFlBQytCLFVBQWtCLEVBQzlCLGFBQTRCLEVBQzVCLE1BQWMsRUFDZCxjQUE4QixFQUM5QixXQUF3QixFQUN4QixXQUF3QixFQUN4QixjQUFxQyxFQUNyQyxjQUE4QixFQUM5QixjQUFvQixFQUNwQixZQUFtQixFQUNuQixXQUEyQixFQUNwQyxRQUFtQixFQUNuQixTQUFvQjtRQUk1QixLQUFLLEVBQUUsQ0FBQTtRQWhCc0IsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQU07UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQU87UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXhCOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUNwQix1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBQ3ZELHFCQUFnQixHQUFnQyxJQUFJLENBQUM7UUFDckQsYUFBUSxHQUEwQixJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUM5RCxvQkFBZSxHQUF3QixJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUVqRSx1QkFBa0IsR0FBYyxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQXVDbkMsb0JBQWUsR0FBVyxFQUFFLENBQUE7UUFDNUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQzFCLGNBQVMsR0FBMEIsSUFBSSxDQUFDO1FBQ3hDLGtCQUFhLEdBQTBCLElBQUksQ0FBQztRQUM3QyxlQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUNwQyxVQUFLLEdBQXNCLElBQUksQ0FBQztRQTRHaEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsdUJBQWtCLEdBQWMsRUFBRSxDQUFDO1FBNE1uQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixzQkFBaUIsR0FBVyxFQUFFLENBQUM7UUEwRy9CLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUsvQixtQkFBYyxHQUFHLEtBQUssQ0FBQTtRQTBDdEIsY0FBUyxHQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDL0YsaUJBQVksR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBbUJ4QyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBZTNCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBUTFCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFFM0IscUJBQWdCLEdBQVE7WUFDdEIsVUFBVSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtZQUNwRCxZQUFZLEVBQUUsRUFBRTtZQUNoQixPQUFPLEVBQUUsRUFBRTtZQUNYLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFHLEVBQUU7WUFDVixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUE7UUFFRCxxQkFBZ0IsR0FBUTtZQUN0QixRQUFRLEVBQUUsS0FBSztZQUNmLFlBQVksRUFBRSxLQUFLO1lBQ25CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBQ0YsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQXhpQnpCLDhFQUE4RTtRQUM5RSw2RUFBNkU7UUFDN0UsdUpBQXVKO1FBQ3ZKLHlGQUF5RjtRQUN6RixvRkFBb0Y7UUFDcEYsOEVBQThFO1FBQzlFLG9HQUFvRztRQUNwRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFZRCxRQUFRO1FBQ04sMERBQTBEO1FBQzFELHFDQUFxQztRQUNyQyw2REFBNkQ7UUFDN0QsaUVBQWlFO1FBQ2pFLElBQUk7UUFDSixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtRQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRGLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWDtnQkFDRSxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7YUFDRjtZQUNEO2dCQUNFLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUU7b0JBQ1osSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNwQix1REFBdUQ7b0JBQ3ZELHNIQUFzSDtnQkFDeEgsQ0FBQzthQUNGO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDbkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFvQixFQUFFLEdBQVcsRUFBRSxFQUFFO3dCQUMzRSxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzt3QkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBa0IsRUFBRSxFQUFFOzRCQUM3RCxJQUFJLEdBQUcsSUFBSSxDQUFDO2dDQUNWLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7NEJBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQ0FDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM5RyxDQUFDLENBQUMsQ0FBQTt3QkFDRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQyxDQUFDLENBQUE7b0JBQ0YsTUFBTSxXQUFXLEdBQXVCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDOUQsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztvQkFDM0QsQ0FBQztvQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUVwRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO3dCQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFOzRCQUN0RCxZQUFZLENBQUMsU0FBUyxHQUFHLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0NBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFtQyxDQUFDO2dDQUNyRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQWtCLEVBQUUsRUFBRTtvQ0FDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO3dDQUM3QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0Q0FDL0MsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7Z0RBQzNELFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnREFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs0Q0FDN0MsQ0FBQzt3Q0FDSCxDQUFDOzZDQUFNLENBQUM7NENBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3Q0FDN0MsQ0FBQztvQ0FDSCxDQUFDO2dDQUNILENBQUMsQ0FBQyxDQUFBOzRCQUNKLENBQUMsQ0FBQTt3QkFDSCxDQUFDLENBQUMsQ0FBQTt3QkFDRixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTs0QkFDL0QsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLENBQUMsWUFBaUIsRUFBRSxFQUFFO2dDQUNqRCxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBbUMsQ0FBQztnQ0FDN0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUU7b0NBQ2pELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQzt3Q0FDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7NENBQy9DLE1BQU0sV0FBVyxHQUF1QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7NENBQzlELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dEQUMzRCxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnREFDNUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzs0Q0FDL0IsQ0FBQzt3Q0FDSCxDQUFDOzZDQUFNLENBQUM7NENBQ04sSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzt3Q0FDL0IsQ0FBQztvQ0FDSCxDQUFDO2dDQUNILENBQUMsQ0FBQyxDQUFBOzRCQUVKLENBQUMsQ0FBQTt3QkFDSCxDQUFDLENBQUMsQ0FBQTt3QkFDRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO3dCQUM3RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFHRCxrQkFBa0I7UUFDaEIsTUFBTSxXQUFXLEdBQWdCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQy9FLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUNELGFBQWEsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFO1lBQy9ELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFnQixFQUFFLEVBQUU7Z0JBQzNELFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUM7WUFDdEcsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM5QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBQ0QsY0FBYztRQUNaLElBQUksZUFBZSxHQUF1QixJQUFJLENBQUM7UUFDL0MsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFO1lBQy9ELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFnQixFQUFFLEVBQUU7Z0JBQzNELFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUM7WUFDdEcsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLFlBQVk7Z0JBQ2QsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxZQUFZO1FBQ1YsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUNkLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJO1lBQ3ZDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1lBQzVELEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7U0FDMUIsQ0FBQzthQUNDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7YUFDdkgsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUscUNBQXFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV6SixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBSUQsYUFBYTtRQUNYLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLENBQWE7UUFDbEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPO1FBQ1QsQ0FBQztRQUNELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFHRCxTQUFTLENBQUMsR0FBUTtRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQWU7UUFDckIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxTQUFTLENBQUMsT0FBNEIsS0FBSztRQUN6QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxvRUFBb0UsRUFBRSxDQUFDLENBQUM7WUFDN0ksT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFdBQVcsR0FBdUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlELElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLFdBQVcsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7Z0JBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDM0QsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxTQUFTLEdBQVksS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQWtCLEVBQUUsRUFBRTtvQkFDN0MsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7d0JBQzNDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ25CLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsSUFBSSxDQUFDLFNBQVM7b0JBQ1osSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0YsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZILENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBdUIsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkYsQ0FBQzthQUFNLENBQUM7WUFFTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRO2dCQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUNsQyxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBdUIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLFFBQWdCO1FBQ3pCLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdILElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sV0FBVyxHQUF1QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDOUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztnQkFDekQsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQXVCLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQXVCLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3RixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ILENBQUM7SUFDSCxDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsaUNBQWlDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUgsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxXQUFXLEdBQXVCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5RCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixXQUFXLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQzNJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsSCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLElBQUksQ0FBQztnQkFDdEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDNUksSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELGFBQWEsQ0FBQyxPQUFnQjtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUUsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsV0FBVyxDQUFDLFFBQWEsRUFBRSxLQUFhO1FBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsT0FBWTtRQUU3QixxRUFBcUU7UUFDckUsNkJBQTZCO1FBQzdCLG1FQUFtRTtRQUNuRSxzRkFBc0Y7UUFDdEYsT0FBTztRQUNQLEtBQUs7UUFFTCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFHRCxnQkFBZ0I7UUFDZCxNQUFNLFdBQVcsR0FBZ0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUvRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUM7WUFDL0YsT0FBTztRQUVULElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDeEgsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBVztZQUN0QixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQ25DLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtZQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSTtZQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDdkIsYUFBYSxFQUFFLEVBQUU7U0FDbEIsQ0FBQTtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUNBQWlDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDaEksSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3BILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLGtCQUFrQixDQUFDLGNBQTJCO1FBQ3BELElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQWtCLEVBQUUsRUFBRTtZQUM3QyxJQUFJLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQzVDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUNPLDJCQUEyQixDQUFDLGNBQTJCO1FBQzdELElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQWtCLEVBQUUsRUFBRTtZQUNqRCxJQUFJLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQzVDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsV0FBVztRQUVULElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxHQUFHO1lBQzFCLE9BQU87UUFFVCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixPQUFPLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBVTtRQUNqQixRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2QsS0FBSyxLQUFLO2dCQUNSLE9BQU8sV0FBVyxDQUFBO1lBQ3BCLEtBQUssS0FBSztnQkFDUixPQUFPLFdBQVcsQ0FBQTtZQUNwQixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxXQUFXLENBQUE7WUFDcEIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sV0FBVyxDQUFBO1lBQ3BCLEtBQUssS0FBSztnQkFDUixPQUFPLFdBQVcsQ0FBQTtZQUNwQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxZQUFZLENBQUE7WUFDckIsS0FBSyxNQUFNO2dCQUNULE9BQU8sWUFBWSxDQUFBO1lBQ3JCLEtBQUssTUFBTTtnQkFDVCxPQUFPLFVBQVUsQ0FBQTtZQUNuQixLQUFLLElBQUk7Z0JBQ1AsT0FBTyx3QkFBd0IsQ0FBQTtZQUNqQyxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxtQkFBbUIsQ0FBQTtZQUM1QjtnQkFDRSxPQUFPLFdBQVcsQ0FBQTtRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUNELGVBQWUsQ0FBQyxNQUFXLEVBQUUsS0FBVTtRQUNyQyxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFHRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDN0QsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsYUFBYSxDQUFDLFlBQWlCLEVBQUUsR0FBUTtRQUN2QyxPQUFPLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUNELGtCQUFrQixDQUFDLElBQVk7UUFDN0IsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssTUFBTTtnQkFDVCxPQUFPLFNBQVMsQ0FBQTtZQUNsQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxTQUFTLENBQUE7WUFDbEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sbURBQW1ELENBQUE7WUFDNUQ7Z0JBQ0UsT0FBTyxTQUFTLENBQUE7UUFDcEIsQ0FBQztJQUVILENBQUM7SUFDRCxjQUFjLENBQUMsSUFBWTtRQUN6QixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxNQUFNO2dCQUNULE9BQU8sU0FBUyxDQUFBO1lBQ2xCLEtBQUssU0FBUztnQkFDWixPQUFPLFNBQVMsQ0FBQTtZQUNsQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxtREFBbUQsQ0FBQTtZQUM1RDtnQkFDRSxPQUFPLDBFQUEwRSxDQUFBO1FBQ3JGLENBQUM7SUFDSCxDQUFDO0lBQ0QsWUFBWSxDQUFDLEtBQVU7UUFDckIsUUFBUSxDQUFBO1FBQ1IsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFeEQsT0FBTyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBSUQsUUFBUSxDQUFDLEdBQVE7UUFDZixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUNmLE9BQU8sT0FBTyxDQUFBO2FBQ1gsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDcEIsT0FBTyxPQUFPLENBQUE7YUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUNwQixPQUFPLE9BQU8sQ0FBQTs7WUFFZCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBQ0QsYUFBYSxDQUFDLEVBQVU7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBSUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUM3RCxPQUFPO1FBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDdEYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxFQUNDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDdEgsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBR0QsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUM1RCxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFBO1lBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFxQkQsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUN0QyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNyQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbkMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO2FBQU0sSUFBSSxDQUFDLGtEQUFrRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNuQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNySCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztvQkFDdEIsUUFBUSxFQUFFLE1BQU07b0JBQ2hCLE9BQU8sRUFBRSxxQkFBcUI7b0JBQzlCLE1BQU0sRUFBRSxzQ0FBc0M7b0JBQzlDLEdBQUcsRUFBRSxxQkFBcUI7aUJBQzNCLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7b0JBQ3RCLFFBQVEsRUFBRSxNQUFNO29CQUNoQixPQUFPLEVBQUUscUJBQXFCO29CQUM5QixNQUFNLEVBQUUsNkNBQTZDO29CQUNyRCxHQUFHLEVBQUUscUJBQXFCO2lCQUMzQixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO29CQUN0QixRQUFRLEVBQUUsTUFBTTtvQkFDaEIsT0FBTyxFQUFFLHFCQUFxQjtvQkFDOUIsTUFBTSxFQUFFLHNDQUFzQztvQkFDOUMsR0FBRyxFQUFFLHFCQUFxQjtpQkFDM0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFDSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7b0JBQ3RCLFFBQVEsRUFBRSxNQUFNO29CQUNoQixPQUFPLEVBQUUscUJBQXFCO29CQUM5QixNQUFNLEVBQUUsb0NBQW9DO29CQUM1QyxHQUFHLEVBQUUscUJBQXFCO2lCQUMzQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsa0VBQWtFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSx5R0FBeUcsSUFBSSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLFdBQVcsQ0FBQztRQUNwVixJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FDcEUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUN0QixRQUFRLEVBQUUsU0FBUztnQkFDbkIsT0FBTyxFQUFFLHFCQUFxQjtnQkFDOUIsTUFBTSxFQUFFLDJDQUEyQztnQkFDbkQsR0FBRyxFQUFFLGtCQUFrQjthQUN4QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDLEVBQ0QsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUN0QixRQUFRLEVBQUUsT0FBTztnQkFDakIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU87Z0JBQzNCLEdBQUcsRUFBRSxxQkFBcUI7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUN0QixRQUFRLEVBQUUsS0FBSztZQUNmLFlBQVksRUFBRSxLQUFLO1lBQ25CLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osWUFBWSxFQUFFLEVBQUU7WUFDaEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQ0QsYUFBYSxDQUFDLEtBQVU7UUFDdEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBQ0QsVUFBVTtRQUNSLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNuRSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDRCxjQUFjLENBQUMsS0FBYTtRQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbkQsQ0FBQztJQUNELGFBQWEsQ0FBQyxRQUFxQztRQUNqRCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUMxQixtQkFBbUI7WUFDbkI7Z0JBQ0UsVUFBVSxFQUFFLG1CQUFtQjthQUNoQyxDQUNGLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDMUI7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sRUFBRSxzQkFBc0I7Z0JBQ3RDLE1BQU0sRUFBRSxPQUFPLEVBQUUsdUJBQXVCO2dCQUN4QyxRQUFRLEVBQUUsT0FBTztnQkFDakIsVUFBVSxFQUFFLGtCQUFrQjthQUMvQixDQUNGLENBQUM7UUFFSixDQUFDO0lBQ0gsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVLENBQUMsV0FBZ0I7UUFDekIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2hELENBQUM7YUFDSSxJQUFJLFdBQVcsR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEQsQ0FBQzthQUNJLENBQUM7WUFDSixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQzsrR0FwdkJVLG9CQUFvQixrQkF5QnJCLFdBQVc7bUdBekJWLG9CQUFvQixtVEFKcEIsQ0FBQyxjQUFjLENBQUMsMkVBS2hCLHVCQUF1QixrSkM5RXBDLCt5cENBZ3ZCTSx5MGVEaHNCRixZQUFZLHEwQkFDWixXQUFXLG94QkFDWCxvQkFBb0IsdWhCQUNwQixPQUFPLDJJQUlQLG1CQUFtQiwwR0FDbkIsd0JBQXdCLHNJQUN4QixrQkFBa0IseUZBQ2xCLG1CQUFtQixtRkFDbkIsY0FBYywrRUFDZCxrQkFBa0IsK0JBQ2xCLHlCQUF5QiwyTkFDekIsb0JBQW9CLCtCQUNwQixtQkFBbUIsNEhBQ25CLFlBQVkseVRBQ1osZUFBZSxpZEFDZixXQUFXLHdXQUVYLFdBQVcsK0JBQ1gsbUJBQW1CLGdHQUNuQixlQUFlLG1GQUNmLHFCQUFxQjs7NEZBTVosb0JBQW9CO2tCQWpDaEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxvQkFBb0I7d0JBQ3BCLE9BQU87d0JBQ1AsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQix3QkFBd0I7d0JBQ3hCLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIseUJBQXlCO3dCQUN6QixvQkFBb0I7d0JBQ3BCLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsdUJBQXVCO3dCQUN2QixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7cUJBQ3RCLGFBQ1UsQ0FBQyxjQUFjLENBQUM7OzBCQTZCeEIsTUFBTTsyQkFBQyxXQUFXO2dXQXhCa0MsZUFBZTtzQkFBckUsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ3BDLEVBQUU7c0JBQWxCLFNBQVM7dUJBQUMsSUFBSTtnQkFHTixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFnT04sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByb2R1Y3REZXNjTW9kYWwsIFByb2R1Y3REZXNjU3R5bGVzTW9kYWwgfSBmcm9tICcuL3Byb2R1Y3QtZGVzYy5tb2RhbCc7XG5pbXBvcnQgeyBJdGVtSW1hZ2UsIEl0ZW1WYXJpYW50LCBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vc3R5bGVzL3Byb2R1Y3QubW9kYWwnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCYWNrZ3JvdW5kTW9kZWwsIEJ1dHRvbk1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcbmltcG9ydCBCYXNlU2VjdGlvbiBmcm9tICcuLi8uLi8uLi9zZWN0aW9ucy9CYXNlU2VjdGlvbic7XG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnQtZml0LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE5neEltYWdlWm9vbU1vZHVsZSB9IGZyb20gJ25neC1pbWFnZS16b29tJztcbmltcG9ydCB7IEZlYXR1cmVkUHJvZHVjdHNDb21wb25lbnQgfSBmcm9tIFwiLi4vZmVhdHVyZWQtcHJvZHVjdHMvZmVhdHVyZWQtcHJvZHVjdHMuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RNb2RhbCB9IGZyb20gJy4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLm1vZGFsJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPcmRlcmVkSXRlbXMgfSBmcm9tICcuLi8uLi9zdHlsZXMvT3JkZXJlZEl0ZW1zLm1vZGFsJztcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBJdGVtVmFyaWVudENvbXBvbmVudCB9IGZyb20gJy4uL2l0ZW0tdmFyaWVudC9pdGVtLXZhcmllbnQuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0LCBNYXRCb3R0b21TaGVldE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XG5pbXBvcnQgeyBCYWNrZ3JvdW5kRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2JhY2tncm91bmQtZGlyZWN0aXZlJztcbmltcG9ydCB7IFNpbXBvV3JhcENvbW50YWluZXIgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvd3JhcC1jb250YWluZXJzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb2xvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU29jaWFJY29uc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL3NvY2lhLWljb25zL3NvY2lhLWljb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYXRpbmdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhdGluZyc7XG5pbXBvcnQgeyBSZXZpZXcgfSBmcm9tICcuLi8uLi9zdHlsZXMvcmV2aWV3Lm1vZGFsJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi9zdHlsZXMvdXNlci5tb2RhbCc7XG5pbXBvcnQgeyBTcGVlZERpYWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NwZWVkZGlhbCc7XG5pbXBvcnQgeyBDdXN0b21lclJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NlY3Rpb25zL2N1c3RvbWVyLXJldmlldy9jdXN0b21lci1yZXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IFBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wYW5lbCc7XG5pbXBvcnQgeyBTdmdEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc3ZnLWRpdmlkZXIvc3ZnLWRpdmlkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvcm5lckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb3JuZXItZGlyZWN0aXZlJztcbmltcG9ydCB7IEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtZGVzYycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgU2ltcG9Db21wb25lbnRNb2R1bGUsXG4gICAgTWF0SWNvbixcbiAgICBDb2xvckRpcmVjdGl2ZSxcbiAgICAvL0RJUkVDVElWRVxuICAgIFNpbXBvV3JhcENvbW50YWluZXIsXG4gICAgQmFja2dyb3VuZERpcmVjdGl2ZSxcbiAgICBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUsXG4gICAgQW5pbWF0aW9uRGlyZWN0aXZlLFxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXG4gICAgSG92ZXJEaXJlY3RpdmUsXG4gICAgTmd4SW1hZ2Vab29tTW9kdWxlLFxuICAgIEZlYXR1cmVkUHJvZHVjdHNDb21wb25lbnQsXG4gICAgTWF0Qm90dG9tU2hlZXRNb2R1bGUsXG4gICAgU29jaWFJY29uc0NvbXBvbmVudCxcbiAgICBSYXRpbmdNb2R1bGUsXG4gICAgU3BlZWREaWFsTW9kdWxlLFxuICAgIFRvYXN0TW9kdWxlLFxuICAgIEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50LFxuICAgIFBhbmVsTW9kdWxlLFxuICAgIFN2Z0RpdmlkZXJDb21wb25lbnQsXG4gICAgQ29ybmVyRGlyZWN0aXZlLFxuICAgIEJ1dHRvbkVkaXRvckRpcmVjdGl2ZVxuICBdLFxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXNjQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24ge1xuICBAVmlld0NoaWxkKEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgcmV2aWV3Q29tcG9uZW50ITogQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2QyJykgZDIhOiBFbGVtZW50UmVmO1xuXG5cbiAgQElucHV0KCkgZGF0YT86IFByb2R1Y3REZXNjTW9kYWw7XG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YSE6IFByb2R1Y3Q7XG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbmV4dENvbXBvbmVudENvbG9yPzogQmFja2dyb3VuZE1vZGVsO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZlYXR1cmVQcm9kdWN0RGF0YTogRmVhdHVyZWRQcm9kdWN0TW9kYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHJlY2VudFZpZXdlZERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyB2YXJpZW50czogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBwdWJsaWMgc2VsZWN0ZWRWYXJpZW50OiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwdWJsaWMgcmVsYXRlZFByb2R1Y3REYXRhOiBQcm9kdWN0W10gPSBbXTtcbiAgcHVibGljIHByb2R1Y3RSZXZpZXc6IG51bWJlciA9IDA7XG4gIHB1YmxpYyB0b3RhbFJldmlldzogbnVtYmVyID0gNTtcbiAgcHVibGljIHNob3dSZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhVGFnU2VydmljZTogTWV0YSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU2VydmljZTogVGl0bGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBib3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG5cbiAgKSB7XG5cbiAgICBzdXBlcigpXG5cbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6IFwiZGVzY3JpcHRpb25cIiwgY29udGVudDogXCJUZXN0aW5nXCIgfSk7XG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp0aXRsZVwiLCBjb250ZW50OiBcIlRpdGxlXCIgfSk7XG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzppbWFnZVwiLCBjb250ZW50OiBcImh0dHBzOi8vZGV2LWJlZW9zLnMzLmFtYXpvbmF3cy5jb20vbGlicmFyeS1tZWRpYS84NDg3MjhjMTcyNjA4NjAwOTY1NmltYWdlcy5wbmdcIiB9KTtcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOmRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFwiRGVzY3JpcHRpb25cIiB9KTtcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnNpdGVfbmFtZVwiLCBjb250ZW50OiBcIm5hdHVyYWxzXCIgfSk7XG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp0eXBlXCIsIGNvbnRlbnQ6IFwid2Vic2l0ZVwiIH0pO1xuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6dXJsXCIsIGNvbnRlbnQ6IFwiaHR0cHM6Ly9uYXR1cmFscy5kZXYuc2ltcG8uYWkvXCIgfSk7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSByZXNwb25zZTtcbiAgICB9KVxuICB9XG5cbiAgYnV0dG9uSWQ/OiBzdHJpbmc7XG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsXG4gIHN0eWxlcz86IFByb2R1Y3REZXNjU3R5bGVzTW9kYWw7XG4gIHN1YkluZHVzdHJ5TmFtZTogc3RyaW5nID0gJydcbiAgaXNJdGVtQXNGYXZvcml0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIFVTRVJfQ0FSVDogT3JkZXJlZEl0ZW1zW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgaXRlbUltYWdlczogSXRlbUltYWdlW10gPSBbXTtcbiAgaXRlbXM6IE1lbnVJdGVtW10gfCBudWxsID0gbnVsbDtcbiAgYnVzaW5lc3NEZXRhaWxzOiBhbnk7XG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRoaXMuYnVzaW5lc3NEZXRhaWxzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JEZXRhaWxzJylcbiAgICAvLyBpZih0aGlzLmJ1c2luZXNzRGV0YWlscyAhPSBudWxsKSB7XG4gICAgLy8gICB0aGlzLmJ1c2luZXNzRGV0YWlscyA9IEpTT04ucGFyc2UodGhpcy5idXNpbmVzc0RldGFpbHMpO1xuICAgIC8vICAgdGhpcy5zdWJJbmR1c3RyeU5hbWUgPSB0aGlzLmJ1c2luZXNzRGV0YWlscy5zdWJJbmR1c3RyeU5hbWU7XG4gICAgLy8gfVxuICAgIHRoaXMuZ2V0RWNvbW1lcmNlQ29uZmlncygpO1xuICAgIHRoaXMuc3ViSW5kdXN0cnlOYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N1YkluZHVzdHJ5TmFtZScpID8/IFwiXCI7XG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcbiAgICB0aGlzLnJlY2VudFZpZXdlZERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhLCB0cnVlKTtcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xuICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmxcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zWzBdO1xuICAgIHRoaXMuYnV0dG9uSWQgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmlkIDogJycpICsgKHRoaXMuYnV0dG9uID8gdGhpcy5idXR0b24uaWQgOiAnJyk7XG5cbiAgICB0aGlzLml0ZW1zID0gW1xuICAgICAge1xuICAgICAgICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy93aXNobGlzdCddKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hhcmVQcm9kdWN0KCk7XG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0NvcGllZCcsIGRldGFpbDogJ1lvdSBjYW4gc2hhcmUgdGhlIHVybCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF07XG4gICAgdGhpcy5nZXRQcm9kdWN0QnlDYXRlZ29yeSgpO1xuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xuICAgIH0pXG5cbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtKSA9PiB7XG4gICAgICBjb25zdCBwcm9kdWN0SWQgPSBxUGFyYW1bXCJpZFwiXTtcbiAgICAgIGlmIChwcm9kdWN0SWQpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0RGV0YWlscyhwcm9kdWN0SWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2VbMF07XG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50LCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgdmFyaWVudC5xdWFudGl0eSA9IDA7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHZhcmllbnRLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoaWR4ID09IDApXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KHZhcmllbnRLZXksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XSk7XG4gICAgICAgICAgICAgIGlmICghdGhpcy52YXJpZW50cy5nZXQodmFyaWVudEtleSk/LmluY2x1ZGVzKHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XSkpXG4gICAgICAgICAgICAgICAgdGhpcy52YXJpZW50cy5zZXQodmFyaWVudEtleSwgWy4uLih0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KSA/PyBbXSksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XV0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVsYXRlZFByb2R1Y3RzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBpdGVtVmFyaWFudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xuICAgICAgICAgIGlmIChpdGVtVmFyaWFudCkge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpYW50LnZhcmlhbnRJbWFnZXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGl0bGVTZXJ2aWNlLnNldFRpdGxlKHRoaXMucmVzcG9uc2VEYXRhPy5uYW1lKTtcblxuICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtSW1hZ2VzID0gdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcztcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQgPSBjYXJ0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpYW50ICYmIGl0ZW0udmFyaWVudElkID09IGl0ZW1WYXJpYW50LnZhcmlhbnRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyV2hpc2hsaXN0KCkudGhlbigod2lzaGxpc3RSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICB3aXNobGlzdFJlc3BvbnNlLm9uc3VjY2VzcyA9ICh3aGlzbGlzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpYW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpYW50ICYmIGl0ZW1WYXJpYW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQud2lzaGxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybDtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICB2YXJpZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICByZWNlbnRWaWV3SXRlbUxpc3Q6IFByb2R1Y3RbXSA9IFtdO1xuICBnZXRSZWxhdGVkUHJvZHVjdHMoKSB7XG4gICAgY29uc3QgdXNlckRldGFpbHM6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XG4gICAgaWYgKCEhdXNlckRldGFpbHMpIHtcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVjZW50Vmlld1Byb2R1Y3QodXNlckRldGFpbHMudXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVjZW50Vmlld0l0ZW1MaXN0ID0gcmVzcG9uc2U7XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBzZWxlY3RWYXJpZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YXJpZW50TG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KGtleSwgdmFsdWUpO1xuICAgIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpID0+IHtcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGZvdW5kVmFyaWVudCA9ICh0aGlzLnNlbGVjdGVkVmFyaWVudC5nZXQocHJvcGVydHkpID09IHZhcmllbnQucHJvcGVydGllc1twcm9wZXJ0eV0pICYmIGZvdW5kVmFyaWVudDtcbiAgICAgIH0pXG4gICAgICBpZiAoZm91bmRWYXJpZW50KSB7XG4gICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHZhcmllbnQudmFyaWFudEltYWdlcztcbiAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmw7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnByaWNlID0gdmFyaWVudC5pdGVtVmFyaWFudFByaWNlO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gdmFyaWVudC5pdGVtSW52ZW50b3J5O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSB2YXJpZW50LnZhcmlhbnRJZDtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSB0aGlzLmdldFZhcmllbnRRdWFudGl0eSh2YXJpZW50KTtcbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdGhpcy5pc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QodmFyaWVudCk7XG4gICAgICB9XG4gICAgfSlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSBmYWxzZTtcbiAgICB9LCAzMDApO1xuICB9XG4gIGdldEl0ZW1WYXJpZW50KCk6IEl0ZW1WYXJpYW50IHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdGVkVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gbnVsbDtcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KSA9PiB7XG4gICAgICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHk6IHN0cmluZykgPT4ge1xuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XG4gICAgICB9KVxuICAgICAgaWYgKGZvdW5kVmFyaWVudClcbiAgICAgICAgc2VsZWN0ZWRWYXJpZW50ID0gdmFyaWVudDtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNlbGVjdGVkVmFyaWVudDtcbiAgfVxuXG4gIHNoYXJlUHJvZHVjdCgpIHtcbiAgICBuYXZpZ2F0b3Iuc2hhcmUoe1xuICAgICAgdGl0bGU6ICdCdXkgJyArIHRoaXMucmVzcG9uc2VEYXRhPy5uYW1lLFxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnUHJvZHVjdCBzaGFyZWQnLCBrZXk6ICd3aXNobGlzdCcgfSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnRmFpbGVkIHRvIHNoYXJlIHByb2R1Y3QuIFRyeSBBZ2Fpbi4nLCBrZXk6ICd3aXNobGlzdCcgfSkpO1xuXG4gIH1cbiAgcm91dGVUb0hvbWUoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICB9XG5cbiAgc2NyZWVuV2lkdGg6IGFueTtcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgZ2V0U2NyZWVuU2l6ZSgpIHtcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cblxuICBzY3JvbGwoZTogV2hlZWxFdmVudCkge1xuICAgIGNvbnN0IGQgPSB0aGlzLmQyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYXRUb3AgPSBkLnNjcm9sbFRvcCA9PT0gMDtcbiAgICBjb25zdCBhdEJvdHRvbSA9IGQuc2Nyb2xsVG9wID49IGQuc2Nyb2xsSGVpZ2h0IC0gZC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKChhdFRvcCAmJiBlLmRlbHRhWSA8IDApIHx8IChhdEJvdHRvbSAmJiBlLmRlbHRhWSA+IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBkLnNjcm9sbFRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGQuc2Nyb2xsVG9wICsgZS5kZWx0YVkgKiAyLCBkLnNjcm9sbEhlaWdodCAtIGQuY2xpZW50SGVpZ2h0KSk7XG4gIH1cblxuICBjdXJyZW50SW1nOiBhbnk7XG4gIGNoYW5nZUltZyh1cmw6IGFueSkge1xuICAgIHRoaXMuY3VycmVudEltZyA9IHVybDtcbiAgfVxuXG4gIGdldEtleXModmFyaWVudDogT2JqZWN0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YXJpZW50KTtcbiAgfVxuXG4gIGdvVG9DYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XG4gIH1cblxuICBhZGRUb0NhcnQodHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJyA9ICdBREQnKSB7XG4gICAgaWYgKHRoaXMuaXNJdGVtT3V0T2ZTdG9jaykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3dhcm4nLCBzdW1tYXJ5OiAnQ2FydCcsIGRldGFpbDogJ0l0ZW0gaXMgbm90IGF2YWlsYWJsZSBhcyBvZiBub3cuIFdlIHdpbGwgbm90aWZ5IHlvdSBvbmNlIGF2YWlsYWJsZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICBpdGVtVmFyaWVudC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbVZhcmllbnQucXVhbnRpdHk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbnZlbnRvcnkgPSBpdGVtVmFyaWVudC5pdGVtSW52ZW50b3J5O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5KSB7XG4gICAgICAgIGxldCBpc1ByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnZhcmllbnRJZCA9PSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpIHtcbiAgICAgICAgICAgIGl0ZW0ucXVhbnRpdHkgPSB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eTtcbiAgICAgICAgICAgIGlzUHJlc2VudCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBpZiAoIWlzUHJlc2VudClcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuVVNFUl9DQVJUID0gdGhpcy5VU0VSX0NBUlQ/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQ/LnZhcmlhbnRJZCk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRGF0YT8ucXVhbnRpdHkpXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcbiAgICAgIGlmICh0eXBlID09ICdBREQnKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ICs9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgLT0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9GaWx0ZXIoY2F0ZWdvcnk6IHN0cmluZykge1xuICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsaXN0J10sIHsgcXVlcnlQYXJhbXM6IHsgY2F0ZWdvcnk6IGNhdGVnb3J5IH0gfSk7XG4gIH1cblxuICBhZGRUb0Zhdm91cml0ZSgpIHtcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSXRlbUFzRmF2b3JpdGUpIHtcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gdGhpcy5VU0VSX1dJU0hMSVNUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSA/PyBbXTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlVG9GYXZvdXJpdGUoKSB7XG4gICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gcmVtb3ZlZCBmcm9tIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICBpdGVtVmFyaWVudC53aXNobGlzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVtb3ZlSXRlbUZyb21GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKTtcbiAgICB9XG4gIH1cblxuICBnZXRQcm9kdWN0QnlDYXRlZ29yeSgpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3RCeUNhdGVnb3J5SWQodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNhdGVnb3JpZXM/LlswXT8ucmVmSWQgPz8gXCJcIikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YSA9IHJlc3BvbnNlLmRhdGE/LmZpbHRlcigocHJvZHVjdDogUHJvZHVjdCkgPT4gdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkICE9IHByb2R1Y3QuaXRlbUlkKTtcbiAgICAgIGlmICh0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YT8ubGVuZ3RoID09IDApXG4gICAgICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbigpO1xuICAgIH0pXG4gIH1cbiAgZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbigpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3RCeUNvbGxlY3Rpb25JZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ29sbGVjdGlvbj8uWzBdLnJlZklkID8/IFwiXCIpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XG4gICAgfSlcbiAgfVxuICBjaGFuZ2VQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9kZXRhaWxzJ10sIHsgcXVlcnlQYXJhbXM6IHsgaWQ6IHByb2R1Y3QuaXRlbUlkIH0gfSk7XG4gICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG4gIGdldEtleUJ5SWR4KHByb3BlcnR5OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydHkpW2luZGV4XTtcbiAgfVxuICBpc1ZhcmllbnRBdmFpbGFibGUodmFyaWVudDogYW55KTogYm9vbGVhbiB7XG5cbiAgICAvLyB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KT0+IHtcbiAgICAvLyAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xuICAgIC8vICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcbiAgICAvLyAgICAgLy8gZm91bmRWYXJpZW50ID0gKHZhcmllbnRLZXkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xuICAgIC8vICAgfSlcbiAgICAvLyB9KVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldmlld1RpdGxlOiBzdHJpbmcgPSBcIlwiO1xuICByZXZpZXdEZXNjcmlwdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgYWRkUHJvZHVjdFJldmlldygpIHtcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcblxuICAgIGlmICh0aGlzLnJldmlld1RpdGxlLmxlbmd0aCA9PSAwICYmIHRoaXMucmV2aWV3RGVzY3JpcHRpb24ubGVuZ3RoID09IDAgJiYgdGhpcy5wcm9kdWN0UmV2aWV3ID09IDApXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoIXVzZXJEZXRhaWxzKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB0byBwb3N0IHJldmlldycsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGF5bG9hZDogUmV2aWV3ID0ge1xuICAgICAgcHJvZHVjdElkOiB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQsXG4gICAgICB1c2VySWQ6IHVzZXJEZXRhaWxzLnVzZXJJZCxcbiAgICAgIHJhdGluZzogdGhpcy5wcm9kdWN0UmV2aWV3LFxuICAgICAgcmV2aWV3OiB0aGlzLnJldmlld0Rlc2NyaXB0aW9uLFxuICAgICAgdXNlck5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxuICAgICAgdGl0bGU6IHRoaXMucmV2aWV3VGl0bGUsXG4gICAgICBwcm9kdWN0SW1hZ2VzOiBbXVxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZFJldmlldyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnNob3dSZXZpZXcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnJhdGluZyArPSAxO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiAnVGhhbmtzIGZvciBnaXZpbmcgeW91ciBmZWVkYmFjaycsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgIGlmICh0aGlzLnJldmlld0NvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnJldmlld0NvbXBvbmVudC5nZXRBbGxSZXZpZXdzKCk7XG4gICAgICB9XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYXJpZW50UXVhbnRpdHkocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogbnVtYmVyIHtcbiAgICBsZXQgaXRlbVF1YW50aXR5OiBudW1iZXIgPSAwO1xuICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXG4gICAgICAgIGl0ZW1RdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgfSlcbiAgICByZXR1cm4gaXRlbVF1YW50aXR5O1xuICB9XG4gIHByaXZhdGUgaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IGJvb2xlYW4ge1xuICAgIGxldCBwcmVzZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xuICAgIH0pXG4gICAgcmV0dXJuIHByZXNlbnQ7XG4gIH1cblxuICBlZGl0U2VjdGlvbigpIHtcblxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9ldmVudFNlcnZpY2UudG9nZ2xlRWRpdG9yRXZlbnQuZW1pdChmYWxzZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9ldmVudFNlcnZpY2UuZWRpdFNlY3Rpb24uZW1pdCh7IGRhdGE6IHRoaXMuZGF0YSB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZ2V0IGlzSXRlbU91dE9mU3RvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPT0gMDtcbiAgfVxuICBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQlVTSU5FU1NfQ09OU1RBTlRTLkNVUlJFTkNZO1xuICB9XG4gIGdldCBpc0l0ZW1Mb3dTdG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA8IDU7XG4gIH1cbiAgZ2V0IGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzU7XG4gIH1cblxuICBnZXRDYXJhdChjYXJhdDogYW55KSB7XG4gICAgc3dpdGNoIChjYXJhdCkge1xuICAgICAgY2FzZSAnSzI0JzpcbiAgICAgICAgcmV0dXJuIFwiMjQgQ2FyYXRzXCJcbiAgICAgIGNhc2UgJ0syMic6XG4gICAgICAgIHJldHVybiBcIjIyIENhcmF0c1wiXG4gICAgICBjYXNlICdLMTgnOlxuICAgICAgICByZXR1cm4gXCIxOCBDYXJhdHNcIlxuICAgICAgY2FzZSAnSzE0JzpcbiAgICAgICAgcmV0dXJuIFwiMTQgQ2FyYXRzXCJcbiAgICAgIGNhc2UgJ0sxMCc6XG4gICAgICAgIHJldHVybiBcIjEwIENhcmF0c1wiXG4gICAgICBjYXNlICdLOTk5JzpcbiAgICAgICAgcmV0dXJuIFwiOTkuOSUgUHVyZVwiXG4gICAgICBjYXNlICdLOTI1JzpcbiAgICAgICAgcmV0dXJuIFwiOTIuNSUgUHVyZVwiXG4gICAgICBjYXNlICdLOTAwJzpcbiAgICAgICAgcmV0dXJuIFwiOTAlIFB1cmVcIlxuICAgICAgY2FzZSAnVlMnOlxuICAgICAgICByZXR1cm4gXCJWZXJ5IFNsaWdodGx5IEluY2x1ZGVkXCJcbiAgICAgIGNhc2UgJ1NJJzpcbiAgICAgICAgcmV0dXJuIFwiU2xpZ2h0bHkgSW5jbHVkZWRcIlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiMjQgQ2FyYXRzXCJcbiAgICB9XG4gIH1cbiAgZ2V0UHJpY2VQZXJHcmFtKHdlaWdodDogYW55LCBwcmljZTogYW55KSB7XG4gICAgaWYgKHdlaWdodCAmJiBwcmljZSkge1xuICAgICAgcmV0dXJuIChwcmljZSAvIHdlaWdodCkudG9GaXhlZCgyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIGlzRGVzY3JpcHRpb25Db2xsYXBzZWQgPSBmYWxzZTtcblxuICB0b2dnbGVEZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmlzRGVzY3JpcHRpb25Db2xsYXBzZWQgPSAhdGhpcy5pc0Rlc2NyaXB0aW9uQ29sbGFwc2VkO1xuICB9XG4gIGlzUHJpY2VCcmVha3VwID0gZmFsc2VcbiAgdG9nZ2xlUHJpY2VCcmVha0Rvd24oKSB7XG4gICAgdGhpcy5pc1ByaWNlQnJlYWt1cCA9ICF0aGlzLmlzUHJpY2VCcmVha3VwO1xuICB9XG4gIGdldERpZmZlcmVuY2Uoc2VsbGluZ1ByaWNlOiBhbnksIG1ycDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2VsbGluZ1ByaWNlIC0gbXJwO1xuICB9XG4gIGdldEJhY2tncm91bmRDb2xvcih0eXBlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJHT0xEXCI6XG4gICAgICAgIHJldHVybiBcIiNGRkY0RDFcIlxuICAgICAgY2FzZSBcIkRJQU1PTkRcIjpcbiAgICAgICAgcmV0dXJuIFwiI0VGRTFGNFwiXG4gICAgICBjYXNlIFwiU0lMVkVSXCI6XG4gICAgICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxODBkZWcsICNGQUZBRkEgMCUsICNGRkZGRkYgMTAwJSlcIlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiI2UyZjZmZlwiXG4gICAgfVxuXG4gIH1cbiAgZ2V0SGVhZGVyQ29sb3IodHlwZTogc3RyaW5nKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiR09MRFwiOlxuICAgICAgICByZXR1cm4gXCIjRkRDRDMzXCJcbiAgICAgIGNhc2UgXCJESUFNT05EXCI6XG4gICAgICAgIHJldHVybiBcIiM5RDQzQjhcIlxuICAgICAgY2FzZSBcIlNJTFZFUlwiOlxuICAgICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjQkRCREJEIDAlLCAjRTJFMkUyIDEwMCUpXCJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxNTlkZWcsIHJnYmEoNjUsMTA1LDIyNSwxKSAwJSwgcmdiYSgxMzcsMjA3LDI0MCwxKSAxMDAlKVwiXG4gICAgfVxuICB9XG4gIGdldFRleHRDb2xvcihjb2xvcjogYW55KSB7XG4gICAgZGVidWdnZXJcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDEsIDMpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IChyICogMjk5ICsgZyAqIDU4NyArIGIgKiAxMTQpIC8gMTAwMDtcblxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG4gIGxhbmd1YWdlczogc3RyaW5nW10gPSBbXCJFbmdsaXNoXCIsIFwiVGVsdWd1XCIsIFwiSGluZGlcIiwgXCJUYW1pbFwiLCBcIkthbm5hZGFcIiwgXCJNYWxheWFsYW1cIiwgXCJPdGhlcnNcIl1cbiAgc2VsZWN0ZWRMYW5nOiBzdHJpbmcgPSB0aGlzLmxhbmd1YWdlc1swXVxuXG4gIGdldENsYXNzKG1hcDogYW55KSB7XG4gICAgaWYgKG1hcC5zaXplID09IDEpXG4gICAgICByZXR1cm4gJ2NvbC02J1xuICAgIGVsc2UgaWYgKG1hcC5zaXplID09IDIpXG4gICAgICByZXR1cm4gJ2NvbC00J1xuICAgIGVsc2UgaWYgKG1hcC5zaXplID09IDMpXG4gICAgICByZXR1cm4gJ2NvbC0zJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAnd2lkdGgtbWF4JztcbiAgfVxuICBvbkZpbmRJblN0b3JlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9zdG9yZSddLCB7IHF1ZXJ5UGFyYW1zOiB7IHN0b3JlSWQ6IGlkIH0gfSk7XG4gIH1cblxuICBvbkJvb2tBcHBvaW50bWVudCgpIHtcbiAgICBjb25zb2xlLmxvZygnQm9vayBhcHBvaW50bWVudCBjbGlja2VkJyk7XG4gIH1cbiAgaXNEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XG4gIHBpbmNvZGU6IGFueTtcbiAgc3RvcmVEZXRhaWxzOiBhbnk7XG4gIGdldFN0b3JlRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5waW5jb2RlID09IG51bGwgfHwgdGhpcy5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9IDYpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRTdG9yZUxvY2F0b3JEZXRhaWxzKHRoaXMucGluY29kZS50b1N0cmluZygpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmlzRGV0YWlscyA9IHRydWU7XG4gICAgICB0aGlzLnN0b3JlRGV0YWlscyA9IHJlcz8uZGF0YTtcbiAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBlcnI/LmVycm9yPy5tZXNzYWdlLCBrZXk6ICdTdG9yZSBMb2NhdG9yJyB9KTtcbiAgICAgIH0pXG4gIH1cbiAgYnJhbmRQcm9taXNlczogYW55W10gPSBbXTtcbiAgZWNvbUNvbmZpZ3M6IGFueTtcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEVjb21tZXJjZUNvbmZpZ3MoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmJyYW5kUHJvbWlzZXMgPSByZXM/LmRhdGE/LmJyYW5kUHJvbWlzZXNcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcbiAgICB9KVxuICB9XG4gIGxvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBvdGhlckxhbmd1YWdlOiBzdHJpbmcgPSAnJztcblxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XG4gICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyBcIlwiLFxuICAgIG1vYmlsZU51bWJlcjogXCJcIixcbiAgICBwaW5jb2RlOiBcIlwiLFxuICAgIHVzZXJuYW1lOiBcIlwiLFxuICAgIGVtYWlsIDogXCJcIixcbiAgICBtZXNzYWdlOiBgYCxcbiAgfVxuXG4gIHZhbGlkYXRpb25FcnJvcnM6IGFueSA9IHtcbiAgICB1c2VybmFtZTogZmFsc2UsXG4gICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcbiAgICBwaW5jb2RlOiBmYWxzZSxcbiAgICBlbWFpbDogZmFsc2VcbiAgfTtcbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHNjaGVkdWxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBzY2hlZHVsZVZpZGVvQ2FsbCgpIHtcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFZhbGlkYXRpb25FcnJvcnMoKTtcbiAgICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWU/LnRyaW0oKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnVzZXJuYW1lID0gdHJ1ZTtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlcikge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLm1vYmlsZU51bWJlciA9IHRydWU7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlci50b1N0cmluZygpLmxlbmd0aCAhPT0gMTApIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXIgPSB0cnVlO1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGUgPSB0cnVlO1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsPy50cmltKCkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5lbWFpbCA9IHRydWU7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIS9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLy50ZXN0KHRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbCkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5lbWFpbCA9IHRydWU7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZT8udHJpbSgpIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGZpbGwgYWxsIHRoZSByZXF1aXJlZCBkZXRhaWxzJyxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlci50b1N0cmluZygpLmxlbmd0aCAhPT0gMTApIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIDEwLWRpZ2l0IG1vYmlsZSBudW1iZXInLFxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgNi1kaWdpdCBwaW5jb2RlJyxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWw/LnRyaW0oKSB8fCAhL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvLnRlc3QodGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsKSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xuICAgIHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tZXNzYWdlID0gdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1lc3NhZ2UgKyBgSGksIEkndmUganVzdCBzY2hlZHVsZWQgYSB2aWRlbyBjYWxsIHdpdGggeW91IGZvciB0aGlzIHByb2R1Y3QgJHt0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZX0uIEl0J3MgaW1wb3J0YW50IGFuZCBJJ2QgYXBwcmVjaWF0ZSB5b3VyIHRpbWUg4oCUIGxvb2tpbmcgZm9yd2FyZCB0byBjb25uZWN0aW5nIGFzIHNvb24gYXMgcG9zc2libGUgIGluICR7dGhpcy5zZWxlY3RlZExhbmcgPT0gJ090aGVycycgPyB0aGlzLm90aGVyTGFuZ3VhZ2UgOiB0aGlzLnNlbGVjdGVkTGFuZ30gbGFuZ3VhZ2VgO1xuICAgIHRoaXMucmVzdFNlcnZpY2UucG9zdFZpZGVvQ2FsbERldGFpbHModGhpcy52aWRlb0NhbGxQYXlsb2FkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgICAgIGRldGFpbDogJ1lvdXIgVmlkZW8gQ2FsbCBpcyBTY2hlZHVsZWQgU3VjY2Vzc2Z1bGx5JyxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBTY2hlZHVsaW5nJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgc3VtbWFyeTogJ0Vycm9yJyxcbiAgICAgICAgICBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICByZXNldFZhbGlkYXRpb25FcnJvcnMoKSB7XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0ge1xuICAgICAgdXNlcm5hbWU6IGZhbHNlLFxuICAgICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcbiAgICAgIHBpbmNvZGU6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0Rm9ybSgpIHtcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQgPSB7XG4gICAgICB1c2VybmFtZTogJycsXG4gICAgICBtb2JpbGVOdW1iZXI6ICcnLFxuICAgICAgcGluY29kZTogJycsXG4gICAgICBtZXNzYWdlOiAnJ1xuICAgIH07XG4gICAgdGhpcy5yZXNldFZhbGlkYXRpb25FcnJvcnMoKTtcbiAgfVxuICBvbklucHV0Q2hhbmdlKGZpZWxkOiBhbnkpIHtcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3JzW2ZpZWxkXSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzW2ZpZWxkXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBjbG9zZU1vZGFsKCkge1xuICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlTW9kYWxDZW50ZXInKTtcbiAgICBpZiAobW9kYWxFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShtb2RhbEVsZW1lbnQsICdkYXRhLWJzLWRpc21pc3MnLCAnbW9kYWwnKTtcbiAgICAgIG1vZGFsRWxlbWVudC5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnNbaW5kZXhdPy5pZCA/PyBcIlwiO1xuICB9XG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnNbaW5kZXhdPy5zdHlsZXM7XG4gIH1cbiAgb3BlbmRhaWxvZ2JveCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2NyZWVuV2lkdGggPiA0NzUpIHtcbiAgICAgIHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsXG4gICAgICAgIC8vICB7d2lkdGg6JzUwMHB4J31cbiAgICAgICAge1xuICAgICAgICAgIHBhbmVsQ2xhc3M6ICd2aWRlby1jYWxsLWRpYWxvZycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aDogJzEwMHZ3JywgLy8gRnVsbCB2aWV3cG9ydCB3aWR0aFxuICAgICAgICAgIGhlaWdodDogJzEwMHZoJywgLy8gRnVsbCB2aWV3cG9ydCBoZWlnaHRcbiAgICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICBwYW5lbENsYXNzOiAnYXBwb2ludG1lbnQtZm9ybSdcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgIH1cbiAgfVxuICBjbG9zZURpYWxvZygpIHtcbiAgICB0aGlzLm1hdERpYWxvZy5jbG9zZUFsbCgpO1xuICB9XG5cbiAgZ2V0UmF0aW5ncyhub29mcmF0aW5nczogYW55KSB7XG4gICAgaWYgKG5vb2ZyYXRpbmdzID49IDEwMDApIHtcbiAgICAgIHJldHVybiAobm9vZnJhdGluZ3MgLyAxMDAwKS50b0ZpeGVkKDEpICsgXCJLK1wiO1xuICAgIH1cbiAgICBlbHNlIGlmIChub29mcmF0aW5ncyA+IDEwMDAwMDApIHtcbiAgICAgIHJldHVybiAobm9vZnJhdGluZ3MgLyAxMDAwMDAwKS50b0ZpeGVkKDEpICsgXCJNXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG5vb2ZyYXRpbmdzO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIndpc2hsaXN0XCJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XG4gIDxzZWN0aW9uIGNsYXNzPVwidG90YWwtY29udGFpbmVyXCIgW2lkXT1cImRhdGE/LmlkXCIgW3NpbXBvTGF5b3V0XT1cInN0eWxlcz8ubGF5b3V0XCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIlxuICAgIHNpbXBvSG92ZXIgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW2F0dHIuc3R5bGVdPVwiY3VzdG9tQ2xhc3NcIj5cblxuICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCIgY2xhc3M9XCJzcGVlZGRpYWwtbGluZWFyXCIgKm5nSWY9XCJpc01vYmlsZVwiPlxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCIgW2J1dHRvblN0eWxlXT1cInsnYm9yZGVyLXJhZGl1cyc6ICc1MCUnLCAnaGVpZ2h0JzogJzMwcHgnfVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJjb250YWluZXIgcC0wXCIgW2lkXT1cImRhdGE/LmlkXCIgW3NpbXBvQW5pbWF0aW9uXT1cInN0eWxlcz8uYW5pbWF0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1ub25lXCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogIzAyNjdDMVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJvdXRlVG9Ib21lKClcIj5Ib21lPC9hPiAvXG4gICAgICAgIDxzcGFuPnt7IHJlc3BvbnNlRGF0YT8ubmFtZSB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBoLTEwMFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMjVweDtcIiBjbGFzcz1cImFib3ZlLWhlaWdodFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnbWluLWhlaWdodDogOTV2aCc6IGlzTW9iaWxlLCAnbWF4LXdpZHRoOiA5NXZoJzogIWlzTW9iaWxlfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLTEyIGgtMTAwXCIgY2xhc3M9XCJoZWlnaHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZC1pbWctYmxvY2tcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJJbWFnZVNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNCBjb2wtMTIgaC0xMDAgcHJvZHVjdC1kZXRhaWxcIiAjZDI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTW9iaWxlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmFyaWFudHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzY1wiPjwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTW9iaWxlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmFyaWFudHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc01vYmlsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkFjdGlvbkJ0blwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkRlbGl2ZXJ5U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2aWRlb0NhbGxTY2hlZHVsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJicmFuZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cblxuICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVzY3JpcHRvcnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInByb2R1Y3QtZGVzYyBib2R5LWxhcmdlIGQtYmxvY2tcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uYnJpZWZcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj4gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3Qtc2t1XCI+XG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnlcIj5TS1UgOiB7e3Jlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2t9fTwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNhdGVnb3JpZXMgJiYgKHJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcz8ubGVuZ3RoIHx8IDApID4gMFwiPlxuICAgICAgICAgICAgICBDYXRlZ29yeSA6IDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwiZ29Ub0ZpbHRlcihjYXQucmVmTmFtZSlcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXQgb2YgcmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzO2xldCBpZHggPSBpbmRleFwiPnt7Y2F0LnJlZk5hbWUgfFxuICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19IDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGlkeCsxKSAhPSByZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNhdGVnb3JpZXM/Lmxlbmd0aFwiPiw8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9hPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIihyZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8ucHJvZHVjdFRhZ3M/Lmxlbmd0aCB8fCAwKSA+IDBcIj5UYWdzIDogPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFnIG9mIHJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5wcm9kdWN0VGFnc1wiPnt7dGFnLnRhZ05hbWV9fSxcbiAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlNvY2lhbEljb25zXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJSZXZpZXdTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVsYXRlZFByb2R1Y3REYXRhPy5sZW5ndGhcIj5cbiAgICAgIDxzaW1wby1mZWF0dXJlZC1wcm9kdWN0cyBbZWRpdF09XCJmYWxzZVwiIFtkYXRhXT1cImZlYXR1cmVQcm9kdWN0RGF0YVwiIFtyZXNwb25zZURhdGFdPVwicmVsYXRlZFByb2R1Y3REYXRhXCJcbiAgICAgICAgW2lzUmVsYXRlZFByb2R1Y3RdPVwidHJ1ZVwiIChjaGFuZ2VEZXRhaWxQcm9kdWN0KT1cImNoYW5nZVByb2R1Y3QoJGV2ZW50KVwiPjwvc2ltcG8tZmVhdHVyZWQtcHJvZHVjdHM+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY2VudFZpZXdJdGVtTGlzdD8ubGVuZ3RoXCI+XG4gICAgICA8c2ltcG8tZmVhdHVyZWQtcHJvZHVjdHMgW2VkaXRdPVwiZmFsc2VcIiBbZGF0YV09XCJyZWNlbnRWaWV3ZWREYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWNlbnRWaWV3SXRlbUxpc3RcIlxuICAgICAgICBbaXNSZWxhdGVkUHJvZHVjdF09XCJ0cnVlXCI+PC9zaW1wby1mZWF0dXJlZC1wcm9kdWN0cz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIDxuZy1jb250YWluZXI+XG4gICAgICA8c2ltcG8tY3VzdG9tZXItcmV2aWV3IFtkYXRhXT1cImRhdGFcIj48L3NpbXBvLWN1c3RvbWVyLXJldmlldz5cbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy5kZXZpZGVyPy5kaXNwbGF5XCI+XG4gICAgICA8c2ltcG8tc3ZnLWRpdmlkZXIgW2RpdmlkZXJUeXBlXT1cInN0eWxlcz8uZGV2aWRlcj8uZGV2aWRlclR5cGVcIlxuICAgICAgICBbY29sb3JdPVwibmV4dENvbXBvbmVudENvbG9yPy5jb2xvclwiPjwvc2ltcG8tc3ZnLWRpdmlkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGVkaXR9XCIgKm5nSWY9XCJzaG93RWRpdG9yc1wiPlxuICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiPjwvc2ltcG8taG92ZXItZWxlbWVudHM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVcIiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGRlbGV0ZX1cIj5cbiAgICAgIDxzaW1wby1kZWxldGUtaG92ZXItZWxlbWVudCBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCI+PC9zaW1wby1kZWxldGUtaG92ZXItZWxlbWVudD5cbiAgICA8L2Rpdj5cbiAgPC9zZWN0aW9uPlxuPC9uZy1jb250YWluZXI+XG5cblxuPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcbiAgd2lkdGg6ICcxMDAlJyxcbiAgaGVpZ2h0OiAnNDB2aCcsXG4gICdib3JkZXItcmFkaXVzJzogJzEwcHgnLFxuICAncG9zaXRpb24nOiAncmVsYXRpdmUnLFxuICAncmlnaHQnOiAnNXB4J1xufVwiPlxuPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuXG5cbjxkaXYgY2xhc3M9XCJtb2JpbGUtZm9vdGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJpY29uc1wiPlxuICAgIDxkaXYgKGNsaWNrKT1cImdvVG9DYXJ0KClcIj5cbiAgICAgIDxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cImFkZFRvRmF2b3VyaXRlKClcIlxuICAgICAgICAqbmdJZj1cIiFpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGVfYm9yZGVyPC9tYXQtaWNvbj5cbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJyZW1vdmVUb0Zhdm91cml0ZSgpXCJcbiAgICAgICAgKm5nSWY9XCJpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGU8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm91dC1vZi1zdG9ja1wiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiPk91dCBvZiBTdG9jazwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicXVhbnRpdHlcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIj5cbiAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCI+LTwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+e3tyZXNwb25zZURhdGEucXVhbnRpdHl9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCI+KzwvZGl2PlxuICA8L2Rpdj5cbiAgPGJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxuICAgIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0NhcnQoKVwiXG4gICAgKm5nSWY9XCIhcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9ja1wiPnt7ZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMF0/LmNvbnRlbnQ/LmxhYmVsfX08L2J1dHRvbj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI1Jldmlld1NlY3Rpb24+XG4gIDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjXCI+XG4gICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+Q3VzdG9tZXIgUmV2aWV3PC9kaXY+XG4gICAgPHAtcmF0aW5nIFtjYW5jZWxdPVwiZmFsc2VcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwidG90YWxSZXZpZXdcIiAvPlxuICAgIDxzcGFuPkJlIHRoZSBmaXJzdCB0byB3cml0ZSBhIHJldmlldzwvc3Bhbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibXQtM1wiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtpZF09XCJidXR0b25JZFwiIFtidXR0b25TdHlsZV09XCJidXR0b24/LnN0eWxlc1wiXG4gICAgICBbYmFja2dyb3VuZEluZm9dPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9ICFzaG93UmV2aWV3XCI+e3sgIXNob3dSZXZpZXcgPyAnQWRkXG4gICAgICBSZXZpZXcnIDogJ0NhbmNlbCBSZXZpZXcnfX08L2J1dHRvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1Jldmlld1wiPlxuICAgICAgPGhyIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwidXNlci1yZXZpZXdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+V3JpdGUgYSByZXZpZXc8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJBVElORzwvc3Bhbj5cbiAgICAgICAgPHAtcmF0aW5nIFsobmdNb2RlbCldPVwicHJvZHVjdFJldmlld1wiIFtjYW5jZWxdPVwiZmFsc2VcIiBbcmVhZG9ubHldPVwiZmFsc2VcIiAvPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXcgVGl0bGU8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJHaXZlIHlvdXIgcmV2aWV3IGEgdGl0bGVcIiBbKG5nTW9kZWwpXT1cInJldmlld1RpdGxlXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXc8L3NwYW4+XG4gICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBjb21tZW50cyBoZXJlXCIgWyhuZ01vZGVsKV09XCJyZXZpZXdEZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LWFjdGlvbi1idG5cIj5cbiAgICAgICAgICA8YnV0dG9uIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInNob3dSZXZpZXcgPSBmYWxzZVwiPkNhbmNlbCByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtpZF09XCJidXR0b25JZFwiIFtidXR0b25TdHlsZV09XCJidXR0b24/LnN0eWxlc1wiXG4gICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZFByb2R1Y3RSZXZpZXcoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJvZHVjdFJldmlldyA9PSAwICYmIHJldmlld1RpdGxlPy5sZW5ndGggPT0gMCAmJiByZXZpZXdEZXNjcmlwdGlvbj8ubGVuZ3RoID09IDBcIj5TdWJtaXRcbiAgICAgICAgICAgIHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI1NvY2lhbEljb25zPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBhbGlnbi1pdGVtcy1sZy1jZW50ZXIgZmxleC1jb2x1bW4gZmxleC1sZy1yb3cgZ2FwLWxnLTAgZ2FwLTNcIlxuICAgICAgW25nQ2xhc3NdPVwiZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmRpc3BsYXkgPyAnanVzdGlmeS1jb250ZW50LWJldHdlZW4nIDogJ2p1c3RpZnktY29udGVudC1lbmQnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTBcIiAqbmdJZj1cImRhdGE/LmNvbnRlbnQ/LnNvY2lhbExpbmtzPy5kaXNwbGF5XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmNoYW5uZWxzXCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTttYXJnaW4tcmlnaHQ6IDEwcHg7XCI+XG4gICAgICAgICAgICA8c2ltcG8tc29jaWEtaWNvbnMgW3NvY2lhbEljb25EYXRhXT1cIml0ZW1cIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICAgIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIj48L3NpbXBvLXNvY2lhLWljb25zPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjQWN0aW9uQnRuPlxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXBhcmVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJvdXQtb2Ytc3RvY2sgdGV4dC1jZW50ZXJcIiAqbmdJZj1cImlzSXRlbU91dE9mU3RvY2tcIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5PdXQgb2ZcbiAgICAgIFN0b2NrPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInF1YW50aXR5XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFlY29tQ29uZmlncz8udmlkZW9DYWxsRW5hYmxlZFwiXG4gICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBsdXNcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KCdTVUJTVFJBQ1QnKVwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+LTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiA1MHB4O1wiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgZmNcIlxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7cmVzcG9uc2VEYXRhLnF1YW50aXR5fX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCJcbiAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiXG4gICAgICBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCJcbiAgICAgIChjbGljayk9XCIhZWRpdCA/IG9wZW5kYWlsb2dib3goZGlhbG9nQm94KSA6ICcnXCI+XG4gICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxuICAgIDxkaXYgKm5nSWY9XCIhcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9ja1wiIGNsYXNzPVwidy03NVwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDApXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDApXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXG4gICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgwKVwiXG4gICAgICAgIChjbGljayk9XCIhZWRpdCA/IGFkZFRvQ2FydCgpIDogJydcIj48bWF0LWljb24+c2hvcHBpbmdfY2FydDwvbWF0LWljb24+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmYXZvdXJpdGUgYm9yZGVyLXNvbGlkXCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0Zhdm91cml0ZSgpXCJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwicmVtb3ZlVG9GYXZvdXJpdGUoKVwiXG4gICAgICAgICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2hhcmUtcHJvZHVjdFwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2hhcmUtaWNvblwiIChjbGljayk9XCJzaGFyZVByb2R1Y3QoKVwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN2YXJpYW50cz5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LnN0eWxlcz8uY3VzdG9taXphdGlvbiA9PSAnU3R5bGUxJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE1XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWtleVwiPnt7dmFyaWVudC5rZXl9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgc3R5bGU9XCJnYXA6IDVweDtcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YXJpZW50VmFsdWUgb2YgdmFyaWVudC52YWx1ZVwiIGNsYXNzPVwidmFyaWVudC10YWdcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/ICd3aGl0ZScgOiBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWYXJpZW50KHZhcmllbnQua2V5LCB2YXJpZW50VmFsdWUpXCI+e3t2YXJpZW50VmFsdWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LnN0eWxlcz8uY3VzdG9taXphdGlvbiA9PSAnU3R5bGUyJyAmJiBzZWxlY3RlZFZhcmllbnQuc2l6ZSA+IDBcIj5cbiAgICA8bmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIHN0eWxlMi1jb250YWluZXIgdy0xMDBcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkVmFyaWVudCB8IGtleXZhbHVlXCIgY2xhc3M9XCJweC0zIHB5LTIgdmFyaWVudC1pdGVtXCJcbiAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q2xhc3Moc2VsZWN0ZWRWYXJpZW50KVwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtaGVhZFwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+e3tpdGVtLmtleSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtdmFsdWUgdGV4dC1zdGFydCBmdy02MDBcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICAgICAge3tpdGVtLnZhbHVlIHxcbiAgICAgICAgICAgIHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgcC0wXCIgW2NsYXNzXT1cImdldENsYXNzKHNlbGVjdGVkVmFyaWVudClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRleHQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwIHAtMlwiIGRhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJcbiAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI29mZmNhbnZhc1JpZ2h0VmFyaWFudFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKVwiPkNVU1RPTUlTRVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjUHJvZHVjdERlc2M+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE1cHg7XCJcbiAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8uYXZlcmFnZVJhdGluZyAgJiYgcmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50XCI+XG4gICAgPGRpdiBjbGFzcz1cInJhdGluZyBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMlwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmF0aW5nLW5vIG15LTFcIj57e1wi4q2QXCIgKyAocmVzcG9uc2VEYXRhPy5hdmVyYWdlUmF0aW5nIHwgbnVtYmVyOicxLjEtMicpfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1yYXRpbmdzIG15LTFcIj57e3Jlc3BvbnNlRGF0YT8udG90YWxSZXZpZXdDb3VudCA9PSAxID8gJzEgUmF0aW5nJyA6XG4gICAgICAgIGdldFJhdGluZ3MocmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50KSArIFwiIFwiICsgXCJyYXRpbmdzXCJ9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIiBbbmdDbGFzc109XCJ7J2Rpc2NvdW50LXByaWNlJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlICYmIHJlc3BvbnNlRGF0YS5wcmljZS5kaXNjb3VudGVkUHJpY2UgPiAwXCI+PHNwYW5cbiAgICAgICAgICBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cbiAgICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCIgW25nQ2xhc3NdPVwieydzdHJpa2UtdGhyb3VnaCc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIlxuICAgICAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZSAmJiBnZXREaWZmZXJlbmNlKHJlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZSwgcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlKSA+IDJcIj5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XG4gICAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjAtMCd9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRheC10ZXh0XCI+KE1SUCBJbmNsdXNpdmUgYWxsIHRheGVzKTwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImhlYWRpbmctbGFyZ2UgdHJpbS10ZXh0XCIgY2xhc3M9XCJwcm9kdWN0LWhlYWRpbmdcIj57e3Jlc3BvbnNlRGF0YT8ubmFtZX19PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2MgYm9keS1sYXJnZSBkLWJsb2NrXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCIgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZXNjcmlwdG9ycz5cbiAgPGRpdiBjbGFzcz1cInJvdyBwcm9kLWRlc2NcIj5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGV4dFwiXG4gICAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3IgfHwgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5Qcm9kdWN0IERldGFpbHM8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZWJyZWFrdXAtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKm5nSWY9XCJzdWJJbmR1c3RyeU5hbWUgPT0gJ0Vjb21tZXJjZSBKZXdlbGxlcnknXCIgZGF0YS1icy10b2dnbGU9XCJvZmZjYW52YXNcIlxuICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI29mZmNhbnZhc1JpZ2h0UHJpY2VCcmVha3VwXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKVwiPlxuICAgICAgICAgICsgUFJJQ0UgQlJFQUtVUFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiIGNsYXNzPVwiYm9keS1sYXJnZSBicmllZi1kZXNjXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3JcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yPy5uYW1lXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5jb2xvclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3ViSW5kdXN0cnlOYW1lID09ICdFY29tbWVyY2UgSmV3ZWxsZXJ5J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWxsZXJ5LXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImpld2VsLWNvbnRhaW5lciBtdC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqZXdlbC1oZWFkZXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRIZWFkZXJDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImVsZS5tYXRlcmlhbFR5cGUgPT0gJ0RJQU1PTkQnID8gJyNmZmYnIDogJydcIj5cbiAgICAgICAgICAgICAgICB7e2VsZS5tYXRlcmlhbFR5cGUgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgTmV0IFdlaWdodC9HcmFtXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICB7e2VsZS5wcmltYXJ5TWF0ZXJpYWxXZWlnaHQgKyBcIiBcIiArICdncmFtcyd9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICBQdXJpdHlcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ZWxlLm1hdGVyaWFsUHVyaXR5fX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICBQcmljZS9HcmFtXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICDigrl7eyBnZXRQcmljZVBlckdyYW0oZWxlLnByaW1hcnlNYXRlcmlhbFdlaWdodCxlbGUubWF0ZXJpYWxQcmljZSkgfFxuICAgICAgICAgICAgICAgICAgICBudW1iZXI6JzEuMi0yJ319XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIFZhbHVlXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICDigrl7e2VsZS5tYXRlcmlhbFByaWNlIHwgbnVtYmVyOicxLjItMid9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImpld2VsLWNvbnRhaW5lciBtdC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtaGVhZGVyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0SGVhZGVyQ29sb3IoJ01ha2luZyBDaGFyZ2VzJylcIj5cbiAgICAgICAgICAgICAgTWFraW5nIENoYXJnZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcignTWFraW5nIENoYXJnZXMnKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgTmV0IFdlaWdodFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAge3tyZXNwb25zZURhdGE/LmJhc2VXZWlnaHR9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICBNYWtpbmcgQ2hhcmdlICVcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIHt7cmVzcG9uc2VEYXRhPy5tYWtpbmdDaGFyZ2VQZXJjZW50YWdlfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICBWYWx1ZVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAg4oK5e3tyZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cblxuICAgIDwhLS0gPGRpdiBjbGFzcz1cInRhYi1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCIgaHJlZj1cIiNjb2xsYXBzZUV4YW1wbGVcIiA+RGVzY3JpcHRpb248L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiIGNsYXNzPVwiYm9keS1sYXJnZSBjb2xsYXBzZVwiIGlkPVwiY29sbGFwc2VFeGFtcGxlXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3JcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yPy5uYW1lXCI+PC9kaXY+IC0tPlxuICA8L2Rpdj5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNJbWFnZVNlY3Rpb24+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFyaWVudExvYWRpbmcgJiYgZGF0YT8uc3R5bGVzPy5ncmlkU3R5bGUgPT0gJ1N0eWxlMSdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW1nLWxpc3RcIiAqbmdJZj1cInNjcmVlbldpZHRoID4gNTAwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlc1wiPlxuICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiIFtzcmNdPVwiaW1nLmltZ1VybFwiXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJpbWdcIiAoY2xpY2spPVwiY2hhbmdlSW1nKGltZy5pbWdVcmwpXCIgW3NpbXBvQ29ybmVyXT1cInN0eWxlcz8uY29ybmVyc1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAod2hlZWwpPVwic2Nyb2xsKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50SW1nXCI+XG5cbiAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJzaGFyZS1pY29uXCIgKGNsaWNrKT1cInNoYXJlUHJvZHVjdCgpXCI+c2hhcmU8L21hdC1pY29uPiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc01vYmlsZVwiPlxuICAgICAgICAgIDxpbWcgW3NyY109XCJjdXJyZW50SW1nXCIgY2xhc3M9XCJpbWcgem9vbVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTtcIiBbc2ltcG9Db3JuZXJdPVwic3R5bGVzPy5jb3JuZXJzXCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNNb2JpbGVcIj5cbiAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgW3NyY109XCJjdXJyZW50SW1nXCIgYWx0PVwiXCIgW3NpbXBvQ29ybmVyXT1cInN0eWxlcz8uY29ybmVyc1wiIGNsYXNzPVwiem9vbVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXJyZW50SW1nXCI+XG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCIgYWx0PVwiXCJcbiAgICAgICAgICBbc2ltcG9Db3JuZXJdPVwic3R5bGVzPy5jb3JuZXJzXCI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW1nLWxpc3Qgdy0xMDBcIiAqbmdJZj1cInNjcmVlbldpZHRoIDw9IDUwMFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW1nIG9mIGl0ZW1JbWFnZXNcIj5cbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIiBbc3JjXT1cImltZy5pbWdVcmxcIlxuICAgICAgICAgIGFsdD1cIlwiIGNsYXNzPVwiaW1nIHpvb21cIiAoY2xpY2spPVwiY2hhbmdlSW1nKGltZy5pbWdVcmwpXCJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiaW1nLmltZ1VybCA9PSBjdXJyZW50SW1nID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICd0cmFuc3BhcmVudCdcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXZhcmllbnRMb2FkaW5nICYmIGRhdGE/LnN0eWxlcz8uZ3JpZFN0eWxlID09ICdTdHlsZTInXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBoLTEwMCBvdmVyZmxvdy1zY3JvbGwgbXQtMCB3LTEwMFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1JbWFnZXM/Lmxlbmd0aCA9PSAwXCI+XG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCIgYWx0PVwiXCIgY2xhc3M9XCJpbWdcIlxuICAgICAgICAgIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIiBjbGFzcz1cImNvbC0xMiBoLTEwMCBwLTBcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW1nIG9mIGl0ZW1JbWFnZXNcIj5cbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIiBbc3JjXT1cImltZy5pbWdVcmxcIlxuICAgICAgICAgIGFsdD1cIlwiIGNsYXNzPVwiaW1nIGNvbC02IGgtNzUgcC0xXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIlxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJpbWcuaW1nVXJsID09IGN1cnJlbnRJbWcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgW2NsYXNzLmgtMTAwXT1cInNjcmVlbldpZHRoIDw9IDUwMFwiIFtjbGFzcy53LTEwMF09XCJpdGVtSW1hZ2VzPy5sZW5ndGggPT0gMVwiXG4gICAgICAgICAgW2NsYXNzLmgtMTAwXT1cIml0ZW1JbWFnZXM/Lmxlbmd0aCA9PSAxXCI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICA8L25nLWNvbnRhaW5lcj5cblxuXG5cblxuICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAqbmdJZj1cInZhcmllbnRMb2FkaW5nXCI+XG4gICAgPG5neC1za2VsZXRvbi1sb2FkZXIgY291bnQ9XCIxXCIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAnYm9yZGVyLXJhZGl1cyc6ICcxMHB4JyxcbiAgICAgICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXG4gICAgICAncmlnaHQnOiAnNXB4J1xuICAgIH1cIj5cbiAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNicmFuZGluZz5cbiAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5kIG9mIGJyYW5kUHJvbWlzZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGctMlwiPlxuICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiXG4gICAgICAgICAgW3NyY109XCJicmFuZD8ubG9nb1VybFwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTQwIHAtMCBici01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtdGV4dCB3LTEwMCB0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAge3ticmFuZD8udGl0bGUgfCB0aXRsZWNhc2V9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdmlkZW9DYWxsU2NoZWR1bGU+XG4gIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8udmlkZW9DYWxsRW5hYmxlZFwiIC0tPlxuICA8bmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgdmlkZW8tY29udGFpbmVyXCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxuICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzA5MTM2YzE3NTE5NzgzNzM1ODhuZW0yam53Zm9yXzJkZmU0ZDdjLmdpZlwiIGFsdD1cIlwiXG4gICAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMCBcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGFsaWduLWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1oZWFkLXRleHRcIj5cbiAgICAgICAgICBMaXZlIFZpZGVvIENhbGxcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dFwiPlxuICAgICAgICAgIEpvaW4gYSBsaXZlIHZpZGVvIGNhbGwgd2l0aCBvdXIgY29uc3VsdGFudHMgdG8gc2VlIHlvdXIgZmF2b3VyaXRlIGRlc2lnbnMgdXAgY2xvc2UhXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2NoLWJ0biB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXG4gICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDIpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDIpXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXG4gICAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDIpXCIgKGNsaWNrKT1cIiFlZGl0ID8gb3BlbmRhaWxvZ2JveChkaWFsb2dCb3gpIDogJydcIj5cbiAgICAgICAgICBTY2hlZHVsZSBhIFZpZGVvIENhbGxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI0RlbGl2ZXJ5U2VjdGlvbj5cbiAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LWNvbnRhaW5lclwiPlxuICAgIDxoMiBjbGFzcz1cImRlbGl2ZXJ5LXRpdGxlXCI+RGVsaXZlcnksIFN0b3JlcyAmIFRyaWFsPC9oMj5cblxuICAgIDwhLS0gTG9jYXRpb24gU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHctOTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG14LTFcIj48bWF0LWljb24+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwicG9zdGFsLWNvZGUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlBpbiBDb2RlXCIgWyhuZ01vZGVsKV09XCJwaW5jb2RlXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGxvY2F0ZS1idG5cIiAoY2xpY2spPVwiZ2V0U3RvcmVEZXRhaWxzKClcIj5TdWJtaXQ8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0RldGFpbHNcIj5cbiAgICAgIDwhLS0gRnJlZSBEZWxpdmVyeSBTZWN0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LWljb25cIj7wn46BPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlDaGFyZ2VzID09IDBcIj5GcmVlXG4gICAgICAgICAgICBEZWxpdmVyeSBieSB7eyBzdG9yZURldGFpbHM/LmVzdGltYXRlZERlbGl2ZXJ5RGF0ZSB8IGRhdGU6J2QgTU1NJyB9fTwvc3Bhbj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktdGV4dFwiICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyA+IDBcIj5Zb3VyXG4gICAgICAgICAgICBPcmRlciB3aWxsXG4gICAgICAgICAgICBEZWxpdmVyIGJ5IHt7IHN0b3JlRGV0YWlscz8uZXN0aW1hdGVkRGVsaXZlcnlEYXRlIHwgZGF0ZTonZCBNTU0nIH19IHdpdGggYSBEZWxpdmVyeSBDaGFyZ2Ugb2ZcbiAgICAgICAgICAgIOKCuSB7e2Vjb21Db25maWdzPy5kZWxpdmVyeUNoYXJnZXMgfCBudW1iZXI6JzEuMi0yJ319PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE5lYXJlc3QgU3RvcmUgU2VjdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgc3RvcmUtaXRlbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RvcmUtaWNvblwiPvCfj6o8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLWRldGFpbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS10ZXh0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RvcmUtbGFiZWxcIj5OZWFyZXN0IFN0b3JlIC0gPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLW5hbWVcIj57eyBzdG9yZURldGFpbHM/Lm5lYXJieVN0b3JlPy5uYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJzdG9yZS1kaXN0YW5jZVwiPiAoNGttKTwvc3Bhbj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImF2YWlsYWJpbGl0eS1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhaWxhYmlsaXR5LWJhZGdlXCI+4o+wIEFWQUlMQUJMRSBCWSAyOCBKVU48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJvdGhlci1zdG9yZXMtdGV4dFwiPlxuICAgICAgICAgICAgICBBbHNvIEF2YWlsYWJsZSBpbiA8c3BhbiBjbGFzcz1cIm90aGVyLXN0b3Jlcy1saW5rXCI+MTggb3RoZXIgc3RvcmVzPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbmQtc3RvcmUtYnRuXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcbiAgICAgICAgICAgIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgxKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgxKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxuICAgICAgICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCIgKGNsaWNrKT1cIm9uRmluZEluU3RvcmUoc3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVJZClcIj5GSU5EIElOXG4gICAgICAgICAgICBTVE9SRTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRyeSBBdCBIb21lIFNlY3Rpb24gLS0+XG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgdHJ5LWhvbWUtaXRlbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaG9tZS1pY29uXCI+8J+PoDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWhvbWUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1ob21lLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRyeS1ob21lLXRleHRcIj5UcnkgQXQgSG9tZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcmVlLXRleHRcIj4gKEl0J3MgRnJlZSk8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC10ZXh0XCI+XG4gICAgICAgICAgICAgIEhvbWUgQXBwb2ludG1lbnQgPHNwYW4gY2xhc3M9XCJhcHBvaW50bWVudC1hdmFpbGFibGVcIj5BdmFpbGFibGUgdG8gdHJ5IGZyb20gMjggSnVuPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4LWFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJvb2stYXBwb2ludG1lbnQtYnRuXCI+Qk9PSyBIT01FIEFQUE9JTlRNRU5UPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+IC0tPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cIm9mZmNhbnZhcyBvZmZjYW52YXMtZW5kIG9mZmNhbnZhcy12YXJpYW50XCIgdGFiaW5kZXg9XCItMVwiIGlkPVwib2ZmY2FudmFzUmlnaHRWYXJpYW50XCJcbiAgYXJpYS1sYWJlbGxlZGJ5PVwib2ZmY2FudmFzUmlnaHRMYWJlbFwiPlxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZi0xOFwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHB4LTMgcGItMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJwcmljZS10ZXh0XCI+UHJpY2U8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4ICBnLTMgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIiBbbmdDbGFzc109XCJ7J2Rpc2NvdW50LXByaWNlJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlICYmIHJlc3BvbnNlRGF0YS5wcmljZS5kaXNjb3VudGVkUHJpY2UgPiAwXCI+PHNwYW5cbiAgICAgICAgICBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cbiAgICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCJcbiAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5zZWxsaW5nUHJpY2UgJiYgZ2V0RGlmZmVyZW5jZShyZXNwb25zZURhdGE/LnByaWNlPy5zZWxsaW5nUHJpY2UsIHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZSkgPiAyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydzdHJpa2UtdGhyb3VnaCc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIj48c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cbiAgICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5zZWxsaW5nUHJpY2UgfCBudW1iZXI6JzEuMC0wJ319PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidmFyaWVudC1jb250YWluZXIgaC0xMDAgcC0zXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiB2YXJpZW50cyB8IGtleXZhbHVlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQta2V5XCI+e3t2YXJpZW50LmtleX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhcmllbnRWYWx1ZSBvZiB2YXJpZW50LnZhbHVlXCIgY2xhc3M9XCJ2YXJpZW50LXRhZ1wiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gJ3doaXRlJyA6IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQodmFyaWVudC5rZXksIHZhcmllbnRWYWx1ZSlcIj57e3ZhcmllbnRWYWx1ZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29uZmlybS1idG4gdy0xMDAgcC0zIHRleHQtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgZGF0YS1icy1kaXNtaXNzPVwib2ZmY2FudmFzXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgc3R5bGU9XCJjb2xvcjogd2hpdGU7XCI+Q29uZmlybVxuICAgIEN1c3RvbWl6YXRpb248L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RpYWxvZ0JveD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWFkZXIgdy0xMDAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJjbG9zZURpYWxvZygpXCJcbiAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZi0xOFwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nLXZpZGVvIHctMTAwIHB5LTIgdGV4dC1jZW50ZXJcIj5MaXZlIFZpZGVvIGNhbGwgYXQgeW91ciBjb252ZW5pZW5jZSE8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGgtMTAwIHAtMFwiPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGgtMTAwIHctMTAwIG10LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzg5NzY1MWMxNzUxOTgwNDg3MTcwVmRvIENhbGwuZ2lmXCIgYWx0PVwiXCJcbiAgICAgICAgICAgIGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBwb3NpdGlvbi1yZWxhdGl2ZSBoLTEwMFwiPlxuXG4gICAgICAgICAgPCEtLSBOYW1lIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy51c2VybmFtZVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBOYW1lKlwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCd1c2VybmFtZScpXCI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5lbWFpbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgRW1haWwqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLmVtYWlsXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ2VtYWlsJylcIj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTW9iaWxlIE51bWJlciBJbnB1dCB3aXRoIFZhbGlkYXRpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHQtY2FsbFwiPklOICs5MTwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE1vYmlsZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ21vYmlsZU51bWJlcicpXCI+XG4gICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgIDwhLS0gUGluY29kZSBJbnB1dCB3aXRoIFZhbGlkYXRpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMucGluY29kZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0LWNhbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMiBib3JkZXItdW5zZXRcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZi0xOCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5ncHNfZml4ZWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIENvZGUqXCIgY2xhc3M9XCJ3LTg4XCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGVcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgncGluY29kZScpXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxhbmd1YWdlIG15LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRleHQgbWItMlwiPkxhbmd1YWdlIFByZWZlcmVuY2U8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1jb250YWluZXIgZC1mbGV4IGdhcC0yIGZsZXgtd3JhcCBtdC0xXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhbmcgcHgtMiBweS0xIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGFuZyA9PSBzZWxlY3RlZExhbmcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTGFuZyA9IGxhbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImxhbmcgPT0gc2VsZWN0ZWRMYW5nID8gZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpIDogJyMwMDAwMDAnXCI+XG4gICAgICAgICAgICAgICAgICB7e2xhbmd9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExhbmcgPT0gJ090aGVycydcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT3RoZXIgTGFuZ3VhZ2VcIiBbKG5nTW9kZWwpXT1cIm90aGVyTGFuZ3VhZ2VcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ2aWRlby1idG4gbXQtMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAoY2xpY2spPVwic2NoZWR1bGVWaWRlb0NhbGwoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdWJtaXR0aW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFNDSEVEVUxJTkcuLi5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1N1Ym1pdHRpbmcgJiYgIXNjaGVkdWxlZFwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+dmlkZW9fY2FsbDwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgIFNDSEVEVUxFIEEgVklERU8gQ0FMTFxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2NoZWR1bGVkXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPiZuYnNwO1xuICAgICAgICAgICAgICBTQ0hFRFVMRUQgU1VDQ0VTU0ZVTExZXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwib2ZmY2FudmFzIG9mZmNhbnZhcy1lbmQgb2ZmY2FudmFzLXNtYWxsIG92ZXJmbG93LXNjcm9sbFwiIHRhYmluZGV4PVwiLTFcIiBpZD1cIm9mZmNhbnZhc1JpZ2h0UHJpY2VCcmVha3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1lbmQgcC0xMC0yMFwiPlxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZi0xOFwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHAtMTAtMjBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnJlYWstaGVhZGVyXCI+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInByaWNlLWJyZWFrdXAgaC0xMDAgdy0xMDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgcmVzcG9uc2VEYXRhPy5tYXRlcmlhbHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXIgbWItMyBwLTEwLTIwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXItaGVhZGVyXCI+XG4gICAgICAgICAge3sgZWxlLm1hdGVyaWFsVHlwZSArIFwiIEJSRUFLVVBcIiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBoZWFkZXItcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+Q09NUE9ORU5UPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+UkFURTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPldFSUdIVDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPkZJTkFMIFZBTFVFPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHZhbHVlLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPnt7IGVsZS5tYXRlcmlhbFB1cml0eSB8IHRpdGxlY2FzZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPuKCuXt7IGdldFByaWNlUGVyR3JhbShlbGUucHJpbWFyeU1hdGVyaWFsV2VpZ2h0LCBlbGUubWF0ZXJpYWxQcmljZSkgfCBudW1iZXI6JzEuMi0yJyB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPnt7IGVsZS5wcmltYXJ5TWF0ZXJpYWxXZWlnaHQgKyBcIiBncmFtc1wiIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRvdGFsXCI+4oK5e3sgZWxlLm1hdGVyaWFsUHJpY2UgfCBudW1iZXI6JzEuMi0yJyB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cInByaWNlLWNvbnRhaW5lciBtYi0zIHAtMTAtMzAgcHktMCBib3JkZXItdW5zZXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgc3VtbWFyeS1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5NYWtpbmcgQ2hhcmdlczwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+VGF4IEFtb3VudDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnRheEFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LXN0YXJ0XCI+VG90YWwgQW1vdW50PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LWVuZCB0b3RhbFwiPlxuICAgICAgICAgIOKCuXt7KHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ucHJpY2VXaXRob3V0VGF4ICsgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQpIHxcbiAgICAgICAgICBudW1iZXI6JzEuMi0yJ319XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj4iXX0=
|