← back to Designer Wallcoverings
Collection theme consolidated push LIVE (Steve-approved): 5 memos merged, 10/10 verified, assets backed up
a603726e366da0e9760aff6f0c25034b3e176239 · 2026-06-23 16:34:03 -0700 · Steve
Files touched
A shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_custom.css.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_dw-hero-rotator.js.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_grid.js.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/config_settings_schema.json.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/layout_theme.liquid.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_collection.liquid.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_header.liquid.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_collection-toolbar.liquid.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_dw-collection-hero-bg.liquid.pushbakA shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_product-list-item.liquid.pushbak
Diff
commit a603726e366da0e9760aff6f0c25034b3e176239
Author: Steve <steve@designerwallcoverings.com>
Date: Tue Jun 23 16:34:03 2026 -0700
Collection theme consolidated push LIVE (Steve-approved): 5 memos merged, 10/10 verified, assets backed up
---
.../assets_custom.css.pushbak | 1653 ++++++++++++++++++++
.../assets_dw-hero-rotator.js.pushbak | 186 +++
.../assets_grid.js.pushbak | 1037 ++++++++++++
.../config_settings_schema.json.pushbak | 549 +++++++
.../layout_theme.liquid.pushbak | 1267 +++++++++++++++
.../sections_collection.liquid.pushbak | 262 ++++
.../sections_header.liquid.pushbak | 483 ++++++
.../snippets_collection-toolbar.liquid.pushbak | 323 ++++
.../snippets_dw-collection-hero-bg.liquid.pushbak | 128 ++
.../snippets_product-list-item.liquid.pushbak | 174 +++
10 files changed, 6062 insertions(+)
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_custom.css.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_custom.css.pushbak
new file mode 100644
index 00000000..cf46179e
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_custom.css.pushbak
@@ -0,0 +1,1653 @@
+/* Global font override — system sans-serif site-wide (matches product title/SKU) */
+body,html,h1,h2,h3,h4,h5,h6,p,a,span,div,li,td,th,label,input,select,textarea,button,.breadcrumbs,.breadcrumbs a,.breadcrumbs span,.main-content,.page-content,.page-title,.collection-title,.product-title,.product-vendor,.product-price,.product-description,.rte,.rte p,.rte li,.rte a,.rte span,.footer,.site-header,.navigation,.nav-link,.menu-link,.announcement-bar,.toolbar,.search-form,.search-results,.collection-grid,.product-grid,.product-list,.sidebar,.widget,.cart,.mini-cart,.shopify-section,.upper-footer,.upper-footer-item,.footer-blurb,.footer-blurb p,.footer-blurb a,.footer-linklist,.footer-linklist a,.footer-linklist li,.sub-footer-right,.sub-footer__row,.subfooter__payment-types,[class*=footer],[class*=footer] a,[class*=footer] p,[class*=footer] li,[class*=footer] span,[class*=footer] h1,[class*=footer] h2,[class*=footer] h3,[class*=footer] h4{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif!important}
+
+/* Override theme heading font (Lora serif → system sans-serif) */
+.quick-shop-modal-trigger,.product-list-item-inventory,.mega-nav-list .mega-nav-list-title .mega-nav-list-title-link,.navigation.navigation-desktop .mega-nav-list .mega-nav-list-title-link,.product-title,.home-masonry-feature-title,th,.section-title,.page-title,.shopify-policy__title h1,.shopify-policy__title .age-gate__heading,h1,.age-gate__heading,h2,h3,h4,h5,h6,.home-slideshow-slide-heading,.home-promotion-title,.collection-title,.mega-nav-list-title-link,.home-promo-grid-item-heading,.promo-grid__text,.toolbar__title,.sidebar__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif!important}
+.header-search-inline {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex-wrap: nowrap;
+}
+.header-search-inline .search-form {
+ margin: 0;
+}
+.header-search-inline__visual {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 30px;
+ height: 30px;
+ color: inherit;
+}
+.header-search-inline__visual svg {
+ width: 20px;
+ height: 20px;
+ display: block;
+}
+@media (max-width: 1079px) {
+ .header-content-right--inline-search {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ width: auto;
+ }
+}
+.product-list-item-thumbnail {
+ height: 0;
+ padding-bottom: 100%;
+ overflow: hidden;
+}
+.product-list-item-thumbnail > a {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: block;
+}
+.product-list-item-thumbnail img,
+.product-list-item-thumbnail svg {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+.product-info .vertical-center {
+ position: absolute;
+ top: 50%;
+ width: 100%;
+ transform: translateY(-50%);
+}
+.product-list-item > figure:hover .product-info,
+.product-grid-masonry-sizer > figure:hover .product-info {
+ opacity: 0.578159;
+}
+.product-info {
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ opacity: 0;
+ transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ padding: 12px;
+ font-size: 1.07143rem;
+ text-align: center;
+ z-index: 1;
+ transform: translate(-50%) translateY(-50%);
+ color: #000;
+}
+.product-price-discount {
+ font-size: 0.9em;
+ line-height: 1.2;
+}
+
+/* ==========================================================================
+ Original custom css here
+ ========================================================================== */
+
+/* ===============================================
+// Hover Effect CSS
+// =============================================== */
+
+.hover-effect .hidden { display: block !important; visibility: visible !important;}
+.product:hover .hover-effect img { opacity: 1; }
+.hover-effect .hidden {
+position: absolute;
+z-index: -1;
+top: 0;
+width: 100%;
+height: 100%;
+opacity: 0;
+-webkit-transition: opacity 0.3s ease-in-out;
+-moz-transition: opacity 0.3s ease-in-out;
+-o-transition: opacity 0.3s ease-in-out;
+transition: opacity 0.3s ease-in-out;
+}
+.hover-effect:hover .hidden {
+z-index: 100000;
+opacity: 1;
+}
+.hover-effect .caption {
+position: absolute;
+top: 0;
+display: table;
+width: 100%;
+height: 100%;
+background-color: white; /* fallback for IE8 */
+background-color: rgba(255, 255, 255, 0.7);
+text-align: center;
+text-rendering: optimizeLegibility;
+}
+.hover-effect .hidden .caption .centered {
+display: table-cell;
+vertical-align: middle;
+}
+/* ===============================================
+// Reveal module
+// =============================================== */
+
+.reveal .hidden { display: block !important; visibility: visible !important;}
+.product:hover .reveal img { opacity: 1; }
+.reveal { position: relative; }
+.reveal .hidden {
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ -webkit-transition: opacity 0.3s ease-in-out;
+ -moz-transition: opacity 0.3s ease-in-out;
+ -o-transition: opacity 0.3s ease-in-out;
+ transition: opacity 0.3s ease-in-out;
+}
+.reveal:hover .hidden {
+ z-index: 100000;
+ opacity: 1;
+}
+.reveal .caption {
+ position: absolute;
+ top: 0;
+ display: table;
+ width: 100%;
+ height: 100%;
+ background-color: white; /* fallback for IE8 */
+ background-color: rgba(255, 255, 255, 0.7);
+ font: 13px/1.6 sans-serif;
+ text-transform: uppercase;
+ color: #333;
+ letter-spacing: 1px;
+ text-align: center;
+ text-rendering: optimizeLegibility;
+}
+.reveal .hidden .caption .centered {
+ display: table-cell;
+ vertical-align: middle;
+}
+@media (min-width: 480px) and (max-width: 979px) {
+ .reveal .caption {
+ font-size: 11px;
+ }
+}
+div#content {
+ width: 100%;
+ max-width: 1050px;
+ margin-left: auto;
+ margin-right: auto;
+}
+/*==================== 020 css for prod Quantity ============================*/
+
+.mm_quantity {
+ display: inline-block; }
+
+.mm_quantity .input-text.qty {
+ width: 40px;
+ height: 42px;
+ padding: 0 5px;
+ text-align: center;
+ background-color: transparent;
+ border: 1px solid #efefef;
+}
+.mm_quantity.mm_buttons_added {
+ text-align: left;
+ position: relative;
+ white-space: nowrap;
+ vertical-align: top;
+}
+.mm_quantity.mm_buttons_added input {
+ display: inline-block;
+ margin: 0;
+ vertical-align: top;
+ box-shadow: none;
+}
+.mm_quantity.mm_buttons_added .minus,
+.mm_quantity.mm_buttons_added .plus {
+ padding: 7px 10px 8px;
+ height: 42px;
+ background-color: #ffffff;
+ border: 1px solid #efefef;
+ cursor:pointer;
+ color:#000000;
+}
+.mm_quantity.mm_buttons_added .minus {
+ border-right: 0;
+}
+.mm_quantity.mm_buttons_added .plus {
+ border-left: 0;
+ margin-left: 1px;
+}
+.mm_quantity.mm_buttons_added .minus:hover,
+.mm_quantity.mm_buttons_added .plus:hover {
+ background: #eeeeee;
+}
+.mm_quantity input::-webkit-outer-spin-button,
+.mm_quantity input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ margin: 0;
+}
+.mm_quantity.mm_buttons_added .minus:focus,
+.mm_quantity.mm_buttons_added .plus:focus {
+ outline: none;
+}
+/*--------*/
+.shopify-product-form .product-options label {
+ text-transform: uppercase;
+ font-weight: bold;
+ font-size: 14px;
+ font-family: "Times New Roman", Times, serif;
+}
+/* Product option labels: vertically center with selects */
+.shopify-product-form .product-options label.product-option-column-1 {
+ display: flex;
+ align-items: center;
+ align-self: center;
+}
+.shopify-product-form .product-options label.product-option-column-1 strong {
+ line-height: 1.1;
+}
+/* Ensure the control column centers within the grid row too */
+.shopify-product-form .product-options .product-option-column-1 + * {
+ align-self: center;
+}
+/* Product options layout: center items + add row spacing (desktop grid) */
+body.template-product .shopify-product-form .product-options {
+ align-items: center;
+ row-gap: 3px;
+ column-gap: 14px;
+}
+body.template-product .shopify-product-form .product-options .product-option-column-1,
+body.template-product .shopify-product-form .product-options .product-option-column-1 + *,
+body.template-product .shopify-product-form .product-options .select-wrapper,
+body.template-product .shopify-product-form .product-options .last_variant {
+ margin: 0 !important;
+ align-self: center;
+}
+body.template-product .shopify-product-form .product-options label.product-option-column-1 {
+ min-height: 44px;
+}
+.mm_quantity {
+ margin-top: 10px !important;
+}
+
+@media only screen and (max-width: 769px) {
+ body.template-product .shopify-product-form .product-options {
+ display: grid;
+ grid-template-columns: max-content 1fr;
+ column-gap: 12px;
+ align-items: center;
+ width: 100%;
+ max-width: 100%;
+ }
+
+ body.template-product .shopify-product-form .product-options label.product-option-column-1 {
+ min-height: auto;
+ justify-content: flex-start;
+ grid-column: 1;
+ }
+
+ body.template-product .shopify-product-form .product-options select.single-option-selector,
+ body.template-product .shopify-product-form .product-options .last_variant,
+ body.template-product .shopify-product-form .product-options .mm_quantity {
+ grid-column: 2;
+ width: 100%;
+ }
+
+ body.template-product .shopify-product-form .product-options select.single-option-selector {
+ min-width: 0;
+ box-sizing: border-box;
+ height: 44px;
+ line-height: 44px;
+ padding-right: 28px;
+ }
+
+ body.template-product .shopify-product-form .product-options .product-option-row-1 { grid-row: 1; }
+ body.template-product .shopify-product-form .product-options .product-option-row-2 { grid-row: 2; }
+ body.template-product .shopify-product-form .product-options .product-option-row-3 { grid-row: 3; }
+ body.template-product .shopify-product-form .product-options .product-option-row-4 { grid-row: 4; }
+ body.template-product .shopify-product-form .product-options .product-option-row-5 { grid-row: 5; }
+ body.template-product .shopify-product-form .product-options .product-option-row-6 { grid-row: 6; }
+ body.template-product .shopify-product-form .product-options .product-option-row-7 { grid-row: 7; }
+ body.template-product .shopify-product-form .product-options .product-option-row-8 { grid-row: 8; }
+}
+#studioengine{
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+ width: 100vw;
+ height: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 100%;
+}
+#studioeditor {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+ width: 100vw;
+ height: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 100%;
+}
+
+
+
+/*020*/
+
+
+.shopify-product-form .product-add-to-cart{
+ display: block;
+}
+
+/*============*/
+
+/*hide variant ddl from dropdown*/
+
+.last_variant{
+ font-family: "Open Sans",sans-serif!important;
+ font-style: normal!important;
+ font-weight: 400!important;
+ color: #333!important;
+ font-size: 14px!important;
+ line-height: 1.625!important;
+ font-weight: normal!important;
+ text-transform: capitalize!important;
+
+ position: relative;
+ top: -1px;
+}
+@media only screen and (max-width: 769px) {
+ .last_variant{
+ width: 100%;
+ display: inline-block;
+
+ }
+}
+
+/* SC start 009 */
+#custom-popup-overlay{
+ position: fixed;
+ display: none;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: rgba(0,0,0,0.5);
+ z-index: 99999;
+}
+#custom-popup-overlay .custom-popup-main{
+ margin: 80px auto;
+ padding: 20px;
+ background: #fff;
+ border-radius: 5px;
+ width: 30%;
+ position: relative;
+ transition: all 5s ease-in-out;
+ z-index: 9999;
+}
+#custom-popup-overlay .custom-popup-main .custom-close {
+ position: absolute;
+ top: 10px;
+ right: 20px;
+ transition: all 200ms;
+ font-size: 30px;
+ font-weight: bold;
+ text-decoration: none;
+ color: #333;
+ cursor:pointer;
+}
+#custom-popup-overlay .custom-popup-main .custom-close:hover {
+ color: #06D85F;
+}
+#custom-popup-overlay .custom-popup-main .content-main {
+ max-height: 30%;
+ overflow: auto;
+}
+#custom-popup-overlay .site-logo-in-popup{
+ text-align:center;
+ margin-top:25px;
+}
+#custom-popup-overlay .popup-content{
+ padding-top:30px;
+ text-align:center;
+}
+#custom-popup-overlay .site-logo-in-popup img{ width: 130px; }
+
+#custom-popup-overlay #contact_form{
+ padding:0px 5px;
+}
+/* Popup contact form: match intended full-width field styling */
+#custom-popup-overlay .custom-popup-main{
+ width: min(640px, calc(100% - 32px));
+ max-width: 640px;
+ padding: 40px 40px 30px;
+}
+#custom-popup-overlay .popup-content{
+ text-align: left;
+ padding-top: 20px;
+}
+#custom-popup-overlay .popup-content h2{
+ text-align: center;
+ margin: 0 0 22px;
+}
+#custom-popup-overlay .popup-content form{
+ width: 100%;
+}
+#custom-popup-overlay .field-wrap{
+ width: 100%;
+ margin: 0 0 14px;
+}
+#custom-popup-overlay .field-wrap input,
+#custom-popup-overlay .field-wrap textarea{
+ width: 100%;
+ display: block;
+ box-sizing: border-box;
+ padding: 12px 14px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ font-family: inherit;
+ font-size: 16px;
+}
+#custom-popup-overlay .field-wrap textarea{
+ min-height: 150px;
+ resize: vertical;
+}
+#custom-popup-overlay input[type="submit"]{
+ display: block;
+ width: fit-content;
+ min-width: 140px;
+ margin: 18px auto 0;
+ padding: 12px 22px;
+}
+
+@media screen and (max-width: 1100px) {
+ #custom-popup-overlay .custom-popup-main{
+ width: min(640px, calc(100% - 32px));
+ }
+}
+@media screen and (max-width: 1024px) {
+ .product-add-to-cart .add-to-cart{
+ width: 100% !important;
+ max-width:inherit !important;
+ }
+}
+@media screen and (max-width: 600px) {
+ .custom-popup-main .popup-content h2{
+ font-size:1.2rem;
+ }
+
+ #custom-popup-overlay .custom-popup-main{
+ margin: 20px auto;
+ padding: 26px 18px 20px;
+ }
+
+ #custom-popup-overlay .custom-popup-main textarea{
+ min-height:100px;
+ }
+}
+/* SC end 009 */
+
+.block-buttonpdf {
+ margin-top: 25px;
+}
+@media (min-width: 1024px) {
+ .template-search .main-content {
+ max-width: 1600px;
+ }
+
+ .template-search .section-search > .search-results-wrapper {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-around;
+ }
+
+ .template-search .section-search > .search-results-wrapper .search-results-count {
+ flex-basis: 100%;
+ }
+
+ #bc-sf-filter-wrapper {
+ flex-basis: 75%;
+ }
+
+ .template-search .section-search > .search-results-wrapper .search-results-wrapper {
+ flex-basis: 20%;
+ border-left: 1px solid #ccc;
+ }
+
+ #bc-sf-filter-right {
+ width: calc(100% - 237px);
+ }
+}
+.product-options #calculator .element,
+.product-options #calculator .price-marker {
+ padding-left: 0;
+ display: flex;
+ align-items: center;
+}
+.product-options #calculator .element label,
+.product-options #calculator .price-marker > label {
+ font-weight: bold;
+ font-size: 14px !important;
+ font-family: "Times New Roman", Times, serif;
+ /* margin-bottom: 10px !important; */
+ text-transform: uppercase;
+ min-width: 110px;
+ text-align: left;
+}
+.product-options #calculator .element input[type="number"],
+.product-options #calculator .element .formula-block label {
+ font-family: "Open Sans", sans-serif;
+ font-style: normal;
+ color: #333333;
+ font-size: 14px !important;
+ padding-left: 10px;
+}
+.product-options #calculator .price-marker span label {
+ color: #444;
+ font-family: Lora, serif;
+ font-size: 1.28571rem !important;
+ font-weight: 400 !important;
+}
+.product-options #calculator .price-marker span {
+ font-family: Lora, serif;
+ font-size: 1.28571rem !important;
+ font-weight: 400 !important;
+}
+.product-options #calculator .element .formula-block {
+ margin: 0;
+}
+.collection-header {
+ text-align: center;
+}
+.dl-customize-btn, .dl-contact-btn, .dl-sample-btn, .dl-second-sample-btn, .button, .submit, input[type=submit], input[type=button], .pxs-newsletter-form-button, .pxs-image-with-text-button {
+ font-family: Lora,serif;
+ font-style: normal;
+ font-weight: 700;
+ background: black;
+ color: #fff;
+ display: inline-block;
+ text-align: center;
+ line-height: normal;
+ padding: 15px 20px;
+ border-radius: 2px;
+ text-transform: uppercase;
+ font-size: .92857rem;
+}
+/* Hide Contact Us button on product pages */
+body.template-product .dl-contact-btn {
+ display: none !important;
+}
+.home-slideshow-slide-heading {
+ text-shadow: 0px 0px 2px #000, 2px 1px 1px #000, 3px 2px 1px #000, 4px 3px 1px #000, 5px 4px 1px #000;
+ font-size: 3.5em;
+}
+.home-slideshow-slide-subheading {
+ text-shadow: 0px 0px 1px #000, 1px 1px 1px #000, 2px 2px 1px #000;
+ font-weight: 500;
+ font-size: 2em;
+}
+@media (max-width: 769px) {
+ .home-slideshow-slide-heading {
+ color: #000!important;
+ font-size: clamp(1.75rem, 6vw, 2.4rem);
+ line-height: 1.1;
+ text-shadow: 0px 0px 0px #ffffff;
+ }
+ .home-slideshow-slide-subheading {
+ color: #8a8a8a!important;
+ font-size: clamp(1rem, 4.2vw, 1.4rem);
+ line-height: 1.2;
+ text-shadow: 0px 0px 0px #ffffff;
+ font-weight: 400;
+ }
+}
+/* New header */
+.header-layout-compact-left .header-branding-desktop img {
+ max-width: 100px;
+}
+.header-main-content {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+@media (min-width: 1080px) {
+ .header-layout-compact-left .header-branding-desktop {
+ width: 150px;
+ text-align: center;
+ }
+ .sticky-header .header-content-right {
+ display: table-cell;
+ vertical-align: middle;
+ }
+}
+@media (max-width: 1672px) {
+ .navigation.navigation-desktop .navigation-menu > li > a, .navigation.navigation-desktop .navigation-menu summary {
+ padding: 17px 25px;
+ font-size: 14px;
+ }
+ .navigation.navigation-desktop .has-dropdown>a:after, .navigation.navigation-desktop .has-dropdown summary:after, .navigation.navigation-desktop .has-mega-nav>a:after, .navigation.navigation-desktop .has-mega-nav summary:after {
+ right: 5px;
+ }
+}
+@media (max-width: 1525px) {
+ .header-layout-compact-left .header-branding-desktop {
+ width: 100px;
+ }
+ .navigation.navigation-desktop .navigation-menu > li >a, .navigation.navigation-desktop .navigation-menu summary {
+ padding: 17px 20px;
+ }
+ .header-layout-compact-left .navigation-wrapper,
+ .sticky-header .header-layout-compact-left .navigation-wrapper {
+ width: calc(100% - 100px);
+ }
+ .header-layout-compact-left .header-content-right {
+ width: 150px;
+ }
+}
+@media (max-width: 1345px) {
+ .header-layout-compact-left .header-branding-desktop {
+ width: 80px;
+ }
+ .header-layout-compact-left .header-branding-desktop img {
+ max-width: 80px;
+ }
+ .header-main-content {
+ padding: 0 20px;
+ }
+ .header-tools .checkout-link, .header-tools .customer-links, .header-tools .cart-count {
+ font-size: 12px;
+ }
+ .header-layout-compact-left .header-content-right {
+ width: 110px;
+ }
+}
+@media (max-width: 1260px) {
+ .navigation.navigation-desktop .navigation-menu>li>a, .navigation.navigation-desktop .navigation-menu summary {
+ padding: 17px 15px;
+ }
+}
+@media (max-width: 1260px) {
+ .navigation.navigation-desktop .navigation-menu>li>a, .navigation.navigation-desktop .navigation-menu summary {
+ padding: 17px 10px;
+ }
+ .navigation.navigation-desktop .has-dropdown>a:after, .navigation.navigation-desktop .has-dropdown summary:after, .navigation.navigation-desktop .has-mega-nav>a:after, .navigation.navigation-desktop .has-mega-nav summary:after {
+ right: 0;
+ }
+}
+@media (max-width: 1079px) {
+ .header-layout-compact-left .header-content-right {
+ width: auto;
+ margin-right: 35px;
+ }
+}
+/* Product description mobile */
+.product-content__mobile {
+ display: none;
+}
+@media (max-width: 769px) {
+ .product-content__mobile {
+ display: block;
+ }
+ .product-content__desktop {
+ display: none;
+ }
+ .dl-sample-btn {
+ margin-bottom: 10px;
+ }
+ .product-title {
+ font-size: 28px;
+ }
+ .block-buttonpdf .btn-pdf {
+ padding: 10px 15px !important;
+ }
+ .product-options {
+ margin-top: 10px;
+ }
+ .product-description {
+ margin-top: 0;
+ }
+ .cp-vendor-thumb {
+ justify-content: center;
+ align-items: center;
+ }
+ .cp-vendor-thumb-img {
+ max-width: 200px;
+ }
+ .block-buttonpdf .btn-pdf {
+ margin: auto !important;
+ }
+}
+/* End - New header */
+
+#bc-sf-filter-products .product-list-item-thumbnail {
+ display: block;
+ height: 0;
+ overflow: hidden;
+ position: relative;
+ z-index: 1;
+ background-size: cover;
+}
+.product-list-item-thumbnail {
+ display: block;
+ height: 0;
+ overflow: hidden;
+ position: relative;
+ z-index: 1;
+}
+#bc-sf-filter-products .product-list-item-thumbnail img {
+ bottom: 0;
+ display: block;
+ left: 0;
+ margin: auto;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.product-list-item-thumbnail img {
+ bottom: 0;
+ display: block;
+ left: 0;
+ margin: auto;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.addon-item {
+ padding: 30px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+@media screen and (max-width:767px) {
+ .addon-item {
+ flex-direction: column;
+ padding: 0px;
+ }
+}
+.addon-item .item-first {
+ display: flex;
+ align-items: center;
+}
+.addon-items .product-item-details {
+ padding: 0 30px 0 20px;
+ display: flex;
+ flex-direction: column;
+}
+.sticky-header a.visual-search-clickable {
+ display: none;
+}
+/* Hide this block temperally*/
+.pdfproductprint .block-buttonpdf button {
+ display: none !important;
+}
+.mini-cart-item-wrapper {
+ max-height: 360px;
+ overflow-y: auto;
+}
+.mini-cart-item-wrapper .mini-cart-item {
+ display: flex;
+ align-items: center;
+}
+.mini-cart-item.cart-subtotal {
+ flex-direction: column;
+}
+.subtotal-row {
+ width: 100%;
+}
+.product-add-to-cart .add-to-cart, .product-add-to-cart .shopify-payment-button__button, .dl-sample-btn, .dl-second-sample-btn, .dl-customize-btn, .dl-contact-btn {
+ width: 206px;
+ font-size: 12px !important;
+ border-radius: 99px;
+}
+.dl-sample-btn.dl-click-locked,
+.dl-second-sample-btn.dl-click-locked {
+ pointer-events: none;
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+@media screen and (max-width: 1024px) {
+ .product-add-to-cart .add-to-cart, .product-add-to-cart .shopify-payment-button__button, .dl-sample-btn, .dl-second-sample-btn, .dl-customize-btn, .dl-contact-btn {
+ width: 206px !important;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+.mini-cart-item-price, .mini-cart-item .original-price, .mini-cart-item .cart-item-discounts {
+ display: none;
+}
+.mini-cart {
+ right: 0px;
+}
+.mini-cart-wrapper.is-open .mini-cart {
+ display: block;
+}
+.product-message.error-message {
+ width: 206px;
+ height: 45px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid;
+ border-radius: 99px;
+ margin-top: 10px;
+}
+.product-add-to-cart a {
+ margin-bottom: 10px;
+}
+.product-add-to-cart .add-to-cart,
+.product-add-to-cart a {
+ height: 45px;
+}
+.mini-cart-item .remove-item {
+ position: absolute;
+ top: 18px;
+ left: -25px;
+}
+.remove-item svg {
+ fill: #444;
+ width: 20px;
+}
+.product__form .hidden {
+ display: none !important;
+}
+.product-details-wrapper p {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;;
+}
+.add-to-cart.unavailable {
+ display: none !important;
+}
+.dl-second-sample-btn.unavailable {
+ display: none;
+}
+.showonly {
+ display: none;
+}
+/* ===============================================
+// Register Form Design
+// =============================================== */
+
+.register-form-card,
+.login-form-card {
+ max-width: 500px;
+ margin: 40px auto;
+ padding: 40px;
+ background: #ffffff;
+ border-radius: 8px;
+}
+.register-header,
+.login-header {
+ text-align: center;
+ margin-bottom: 30px;
+}
+.welcome-title,
+.login-title {
+ font-size: 24px;
+ font-weight: bold;
+ color: #333;
+ margin: 0 0 8px 0;
+ line-height: 1.2;
+}
+.welcome-subtitle {
+ font-size: 16px;
+ color: #666;
+ margin: 0;
+ line-height: 1.4;
+}
+.name-fields-row {
+ display: flex;
+ gap: 15px;
+ margin-bottom: 10px;
+}
+.name-field {
+ flex: 1;
+}
+.input-wrapper {
+ margin-bottom: 0;
+}
+.input-wrapper label {
+ display: block;
+ font-weight: bold;
+ color: #333;
+ margin-bottom: 8px;
+ font-size: 14px;
+}
+.input-wrapper input[type="text"],
+.input-wrapper input[type="email"],
+.input-wrapper input[type="password"],
+.input-wrapper select {
+ width: 100%;
+ padding: 12px;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ font-size: 14px;
+ background: #fff;
+ color: #666;
+ box-sizing: border-box;
+}
+.input-wrapper input[type="text"]:focus,
+.input-wrapper input[type="email"]:focus,
+.input-wrapper input[type="password"]:focus,
+.input-wrapper select:focus {
+ outline: none;
+ border-color: black;
+ color: white;
+}
+
+.input-wrapper input[type="submit"] {
+ width: 100%;
+ padding: 15px;
+ background: #4185f4;
+ color: #fff;
+ border: none;
+ border-radius: 4px;
+ font-size: 16px;
+ font-weight: bold;
+ text-transform: uppercase;
+ cursor: pointer;
+ transition: background-color 0.3s ease;
+}
+.input-wrapper input[type="submit"]:hover {
+ background: #3367d6;
+}
+/* OR separator between register form and social login */
+.or-separator {
+ position: relative;
+ text-align: center;
+ margin: 20px 0;
+}
+.or-separator::before {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: #ddd;
+}
+.or-text {
+ background: white;
+ padding: 0 15px;
+ font-weight: bold;
+ color: #333;
+ position: relative;
+ z-index: 1;
+}
+/* Hide social login widget on register and login pages */
+/* .register-form-card .os_social_widget,
+.login-form-card .os_social_widget {
+ display: none !important;
+} */
+
+/* Mobile responsiveness */
+@media (max-width: 768px) {
+ .register-form-card,
+ .login-form-card {
+ margin: 20px;
+ padding: 30px 20px;
+ }
+
+ .name-fields-row {
+ flex-direction: column;
+ gap: 0;
+ }
+
+ .name-field {
+ margin-bottom: 20px;
+ }
+
+ .welcome-title,
+ .login-title {
+ font-size: 20px;
+ }
+
+ .welcome-subtitle {
+ font-size: 14px;
+ }
+
+ .keywords-desktop {
+ display: none !important;
+ }
+}
+/** More css custom cod **/
+.product-price-minimum.original {
+ text-decoration: line-through;
+ opacity: .8;
+ font-size: 1.1rem;
+}
+/* Base form control styles (missing from theme.css on some pages) */
+input[type="text"],
+input[type="email"],
+input[type="password"],
+input[type="search"],
+input[type="telephone"],
+input[type="tel"],
+input[type="number"],
+textarea,
+select {
+ font-family: Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: 400;
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 10px 12px;
+ font-size: 1rem;
+ box-sizing: border-box;
+ border-radius: 2px;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ color: inherit;
+ background: #fff;
+ -webkit-appearance: none;
+ appearance: none;
+}
+.boost-sd__in-collection-search {
+ display: none !important;
+}
+/* === Hide prices in You May Also Like / Product Recommendations === */
+.product-recommendations .product-list-item-price {
+ display: none !important;
+}
+
+/* DW Collections Page — full-width override (loads after theme.css) */
+.template-page .page-content > .dw-ex-header,
+.template-page .page-content > .dw-ex-section,
+.template-page .page-content > .dw-ex-grid,
+.template-page .page-content > .dw-ex-gc,
+.template-page .page-content > .dw-ex-section-title,
+.template-page .page-content > .dw-coll-wrap,
+.template-page .page-content > div[class*="dw-ex-"] {
+ max-width: 1500px !important;
+ margin-left: auto !important;
+ margin-right: auto !important;
+}
+.template-page .page-content > .dw-ex-grid {
+ max-width: 1500px !important;
+ padding-left: 24px !important;
+ padding-right: 24px !important;
+}
+
+/* ============================================
+ DW Compact Product Form — Size/Price/Qty
+ Added 2026-03-23 by ClawCoder session
+ ============================================ */
+.product-option-column-1 {
+ width: auto !important;
+ height: auto !important;
+ min-height: 0 !important;
+ margin-right: 4px !important;
+}
+.product-options {
+ display: flex !important;
+ flex-wrap: wrap !important;
+ align-items: center !important;
+ gap: 2px 0 !important;
+ margin: 4px 0 !important;
+}
+.product-options > label,
+.product-options > div.last_variant {
+ display: inline-flex !important;
+ align-items: center !important;
+ height: auto !important;
+ margin: 0 !important;
+}
+.last_variant .selected-text {
+ display: inline !important;
+ font-size: 14px !important;
+}
+.product__price {
+ margin: 2px 0 !important;
+}
+.product-sku-label,
+.product-sku-value {
+ margin-bottom: 2px !important;
+}
+.product-add-to-cart {
+ margin-top: 15px !important;
+}
+.block-buttonpdf {
+ margin-top: 10px !important;
+}
+label.product-option-row-4 {
+ height: auto !important;
+ width: auto !important;
+ margin-right: 4px !important;
+}
+.mm_quantity {
+ margin: 4px 0 !important;
+}
+/* Fix transparent PNG images showing black boxes in collection grids */
+.product-grid-image img,
+.product-image img,
+.product-card img,
+.collection-product-image img,
+.grid__image img,
+.product-grid-item img,
+.product_image img {
+ background-color: #fff !important;
+}
+.product-grid-image,
+.product-image,
+.product-card__image,
+.collection-product-image,
+.grid__image,
+.product-grid-item {
+ background-color: #fff !important;
+}
+
+/* Remove share buttons from product pages */
+.share-buttons,
+.product-share,
+.social-sharing,
+.product__social-sharing,
+.share-icons,
+[class*="share"],
+.product-social-sharing,
+.sharing {
+ display: none !important;
+}
+/* input.add-to-cart,
+input[type="submit"].add-to-cart,
+.product-add-to-cart input[type="submit"],
+.product-add-to-cart .add-to-cart {
+ background-color: #000 !important;
+ color: #fff !important;
+ border: none !important;
+ border-radius: 999px !important;
+ text-align: center !important;
+ font-weight: 500 !important;
+ font-size: 11px !important;
+ letter-spacing: 0.5px !important;
+ text-transform: uppercase !important;
+ padding: 10px 20px !important;
+ cursor: pointer !important;
+ display: inline-block !important;
+ vertical-align: middle !important;
+ line-height: 1 !important;
+ -webkit-appearance: none !important;
+ appearance: none !important;
+} */
+.block-buttonpdf button.btn-pdf {
+ background-color: #000 !important;
+ color: #fff !important;
+ border: none !important;
+ border-radius: 999px !important;
+ padding: 10px 20px !important;
+ font-size: 11px !important;
+ font-weight: 500 !important;
+ letter-spacing: 0.5px !important;
+ text-transform: uppercase !important;
+ font-family: inherit !important;
+ cursor: pointer !important;
+}
+.spec-sheet-btn:hover,
+.dl-sample-btn:hover,
+input.add-to-cart:hover,
+.block-buttonpdf button.btn-pdf:hover {
+ background-color: #333 !important;
+ color: white !important;
+}
+/* Match all product action buttons to the Add to Cart button */
+.product-add-to-cart .add-to-cart,
+.product-add-to-cart .shopify-payment-button__button,
+.product-form--atc .action_button,
+.dl-sample-btn,
+.dl-second-sample-btn,
+.spec-sheet-btn {
+ display: inline-flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ width: 206px !important;
+ min-height: 45px !important;
+ padding: 10px 20px !important;
+ border-radius: 999px !important;
+ box-sizing: border-box !important;
+ font-size: 12px !important;
+ font-weight: 500 !important;
+ letter-spacing: 0.5px !important;
+ line-height: 1 !important;
+ text-align: center !important;
+ text-transform: uppercase !important;
+ text-decoration: none !important;
+}
+
+/* Force prices visible on product pages — overrides Boost transparent color */
+.product-price .money,
+.product-price-minimum.money,
+.product-price-discount.money,
+.product__price .money,
+.product__price span,
+#shopify-section-template--18587140849715__main .money,
+[id*="__main"] .product-price span,
+[id*="__main"] .money {
+ color: inherit !important;
+ opacity: 1 !important;
+ visibility: visible !important;
+}
+/* === Product grid card descriptions === */
+.product-list-item-description {
+ font-size: 12px;
+ line-height: 1.45;
+ color: #666;
+ margin: 3px 0 6px;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+/* === Grid Density Slider Control === */
+.collection-grid-controls {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ margin: 20px 0;
+ padding: 12px 16px;
+ background: #f9f9f9;
+ border-radius: 4px;
+ flex-wrap: wrap;
+}
+.collection-grid-controls label {
+ font-size: 13px;
+ font-weight: 500;
+ color: #666;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ white-space: nowrap;
+}
+.collection-grid-controls-slider {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex: 1;
+ min-width: 200px;
+}
+.collection-grid-controls-slider input[type="range"] {
+ flex: 1;
+ min-width: 120px;
+ height: 6px;
+ border-radius: 3px;
+ background: #ddd;
+ outline: none;
+ -webkit-appearance: none;
+ appearance: none;
+}
+.collection-grid-controls-slider input[type="range"]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: #111;
+ cursor: pointer;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
+}
+.collection-grid-controls-slider input[type="range"]::-moz-range-thumb {
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: #111;
+ cursor: pointer;
+ border: none;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
+}
+.collection-grid-density-value {
+ min-width: 45px;
+ text-align: center;
+ font-weight: 600;
+ color: #111;
+ font-size: 14px;
+}
+/* Dynamic grid columns (3-12) */
+.collection-products {
+ --grid-columns: 3;
+ display: grid !important;
+ grid-template-columns: repeat(var(--grid-columns), 1fr) !important;
+ gap: 16px !important;
+}
+.collection-products.grid-cols-3 { --grid-columns: 3; }
+.collection-products.grid-cols-4 { --grid-columns: 4; }
+.collection-products.grid-cols-5 { --grid-columns: 5; }
+.collection-products.grid-cols-6 { --grid-columns: 6; }
+.collection-products.grid-cols-7 { --grid-columns: 7; }
+.collection-products.grid-cols-8 { --grid-columns: 8; }
+.collection-products.grid-cols-9 { --grid-columns: 9; }
+.collection-products.grid-cols-10 { --grid-columns: 10; }
+.collection-products.grid-cols-11 { --grid-columns: 11; }
+.collection-products.grid-cols-12 { --grid-columns: 12; }
+
+/* Responsive: reduce max columns on mobile */
+@media (max-width: 768px) {
+ .collection-grid-controls {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .collection-grid-controls-slider {
+ width: 100%;
+ }
+
+ .collection-products {
+ --grid-columns: 2 !important;
+ }
+}
+}
+
+/* === Collection Cards: Image only, no text === */
+.product-list-item {
+ cursor: pointer;
+}
+
+.product-list-item-details {
+ display: none !important;
+}
+
+.product-list-item-overlay {
+ display: none !important;
+}
+
+.product-list-item-thumbnail {
+ transition: opacity 0.2s ease, transform 0.2s ease;
+}
+
+.product-list-item:hover .product-list-item-thumbnail {
+ opacity: 0.9;
+ transform: scale(1.02);
+}
+
+/* Hide Boost Commerce hover overlays on collection cards */
+.dw-hover-label {
+ display: none !important;
+}
+
+.boost-sd__product-item-image-overlay {
+ display: none !important;
+}
+
+/* === Collection Card Hover Overlay: Vendor + Pattern Name === */
+.product-list-item-hover-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0);
+ transition: background 0.25s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 10;
+}
+
+.product-list-item:hover .product-list-item-hover-overlay {
+ background: rgba(0, 0, 0, 0.75);
+}
+
+.product-list-item-hover-content {
+ opacity: 0;
+ transition: opacity 0.25s ease;
+ text-align: center;
+ color: white;
+ padding: 20px;
+ pointer-events: none;
+}
+
+.product-list-item:hover .product-list-item-hover-content {
+ opacity: 1;
+}
+
+.product-list-item-hover-vendor {
+ font-size: 11px;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 0.12em;
+ color: #aaa;
+ margin: 0 0 8px;
+ line-height: 1.2;
+}
+
+.product-list-item-hover-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #fff;
+ margin: 0;
+ line-height: 1.4;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
+}
+
+.product-list-item-hover-title a {
+ color: inherit;
+ text-decoration: none;
+}
+
+/* Ensure no text below images */
+.product-list-item-details {
+ display: none !important;
+}
+
+/* Hide any secondary labels */
+.dw-hover-label {
+ display: none !important;
+}
+
+/* Compact spacing: reduce gaps between rows */
+.collection-products {
+ gap: 8px !important;
+ row-gap: 4px !important;
+}
+
+/* Reduce item margins/padding */
+.product-list-item {
+ margin: 0 !important;
+ padding: 0 !important;
+}
+
+.product-list-item-thumbnail {
+ margin: 0 !important;
+}
+
+/* Product card = image ONLY, zero space below */
+.product-list-item {
+ display: flex;
+ flex-direction: column;
+}
+
+.product-list-item-thumbnail {
+ flex: 1;
+ width: 100%;
+}
+
+.product-list-item-details {
+ display: none !important;
+ height: 0 !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ overflow: hidden !important;
+}
+
+/* Article takes only image space */
+.product-list-item article {
+ display: contents;
+}
+
+.product-list-item {
+ overflow: hidden;
+}
+
+/* Ultra-tight grid spacing */
+.collection-products {
+ gap: 2px !important;
+ row-gap: 2px !important;
+}
+
+/* >>> dw-collection-hero-fix START >>> */
+/* ====================================================================
+ DW COLLECTION HERO + DUP-TITLE + MOBILE-HEADER FIX
+ Owner: vp-dw-commerce · 2026-06-23 · DTD verdict F1=B / F2=A / F3=A
+ Appended (marked + idempotent) to a theme-controlled CSS asset.
+ Pairs with snippet 'dw-collection-hero-bg' (emits the per-collection
+ background-image inline) for the F1=B always-on hero.
+ Removable: delete everything between the START/END markers.
+ ==================================================================== */
+
+/* --- F2: kill the duplicate theme leftover title on collection pages.
+ Boost's h1.boost-sd__header-title is the live header (carries image +
+ description); the OOTS theme h1.page-title is a pre-Boost leftover that
+ stacks the same text. Hide the theme one ONLY on collection templates. --- */
+body.template-collection .collection > div > .page-title,
+body.template-collection section.collection .collection-header-content > .page-title,
+body.template-collection .boost-sd__product-filter-fallback .page-title {
+ display: none !important;
+}
+
+/* --- F1: the collection hero band.
+ .dw-collection-hero is a wrapper the snippet emits around the Boost header
+ (or, pre-hydration, the theme header). It always shows a background:
+ collection.image when set, else settings.collection_default_hero, else a
+ soft branded gradient. The title pill stays white-on-image ONLY when a real
+ image is behind it; with no image the title is clean centered dark type on
+ the soft band (no naked dark pill, no flat grey dead-block). --- */
+
+.dw-collection-hero {
+ position: relative;
+ width: 100%;
+ min-height: 220px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ /* default soft branded band when no image var is set */
+ background:
+ linear-gradient(180deg, rgba(0,0,0,0.04), rgba(0,0,0,0.02)),
+ #f4f2ee;
+ background-size: cover;
+ background-position: center;
+ overflow: hidden;
+ margin-bottom: 8px;
+}
+
+/* When the snippet sets --dw-hero-img, paint it as a real cover background
+ with a legibility scrim so the white pill reads. */
+.dw-collection-hero[style*="--dw-hero-img"] {
+ background-image:
+ linear-gradient(180deg, rgba(0,0,0,0.18), rgba(0,0,0,0.34)),
+ var(--dw-hero-img);
+ background-size: cover;
+ background-position: center;
+}
+
+/* --- ROTATING HERO (DTD source=A / curation=C). The snippet emits a
+ [data-dw-hero-rotator] container with N .dw-hero-slide layers; the rotator
+ JS relocates it into the Boost/theme header band as a full-bleed back layer
+ and crossfades the slides. Each slide is an absolutely-positioned cover
+ image with a baked-in legibility scrim. Active slide fades in over the
+ previous one — NO layout shift (the band keeps its min-height). Identical on
+ mobile + desktop (the band is responsive). --- */
+.dw-hero-rotator {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ pointer-events: none;
+ z-index: 0;
+}
+.dw-hero-slide {
+ position: absolute;
+ inset: 0;
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ opacity: 0;
+ transition: opacity 1100ms ease-in-out;
+ will-change: opacity;
+}
+.dw-hero-slide.is-active { opacity: 1; }
+/* Reduced motion: the JS holds frame 1 and skips the timer; also kill the
+ fade transition so there is zero animation for those users. */
+@media (prefers-reduced-motion: reduce) {
+ .dw-hero-slide { transition: none; }
+}
+
+/* The Boost (and theme) header title, hoisted into the hero band.
+ IMAGE PRESENT: keep white text + dark pill (legible over photo). */
+.dw-collection-hero.dw-has-image .boost-sd__header-title,
+.dw-collection-hero.dw-has-image .page-title {
+ color: #fff !important;
+ background: rgba(0,0,0,0.42) !important;
+ border-radius: 4px !important;
+ padding: 12px 28px !important;
+ display: inline-block !important;
+ text-shadow: 0 1px 18px rgba(0,0,0,0.45);
+}
+
+/* NO IMAGE: clean centered dark type, NO pill, NO grey block. */
+.dw-collection-hero:not(.dw-has-image) .boost-sd__header-title,
+.dw-collection-hero:not(.dw-has-image) .page-title {
+ color: #1a1a1a !important;
+ background: transparent !important;
+ border-radius: 0 !important;
+ padding: 0 !important;
+ text-shadow: none !important;
+ letter-spacing: .14em;
+ text-transform: uppercase;
+ font-weight: 300;
+}
+
+/* Belt-and-suspenders: neutralize Boost's default dark pill whenever the
+ collection has NO hero. "No hero" = the snippet did NOT add .dw-has-hero
+ (set only when collection.image OR settings.collection_default_hero exists)
+ AND Boost rendered no native image-inner. Excludes .dw-has-hero so the
+ image case (painted by the snippet's inline <style>) is never stripped. */
+body:not(.dw-collection-has-hero) .boost-sd__collection-header:not(:has(.boost-sd__header-image-inner)) .boost-sd__header-title {
+ background: transparent !important;
+ color: #1a1a1a !important;
+ border-radius: 0 !important;
+ padding: 14px 0 !important;
+ text-shadow: none !important;
+ letter-spacing: .14em;
+ text-transform: uppercase;
+ font-weight: 300;
+}
+body:not(.dw-collection-has-hero) .boost-sd__collection-header:not(:has(.boost-sd__header-image-inner)) {
+ background: #f4f2ee;
+ min-height: 200px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+}
+
+/* keep the description readable inside the band */
+.dw-collection-hero .boost-sd__header-description,
+.dw-collection-hero .collection-description { margin-top: 10px; }
+.dw-collection-hero.dw-has-image .boost-sd__header-description,
+.dw-collection-hero.dw-has-image .boost-sd__header-description * { color: rgba(255,255,255,.92) !important; }
+
+/* --- F3 (FIXED, specificity cascade): mobile header gap.
+ theme.css ships `@media (max-width:769px){ .header-branding{padding:36px 0} }`
+ — a SINGLE-class rule (specificity 0,1,0) in theme.css, which loads AFTER
+ custom.css. Our earlier `.header-branding{...!important}` at max-width:768px
+ lost because it sat in the EARLIER sheet at the SAME specificity AND a
+ breakpoint mismatch (768 vs the theme's 769) left a 1px dead band. Fix WITHOUT
+ !important by RAISING SPECIFICITY: scope to `body.template-collection` (0,2,0)
+ which cleanly outranks the theme's 0,1,0, and MATCH the theme's 769px
+ breakpoint so the rule fires in the exact same media context. This drops the
+ branding block ~118px -> ~74px and closes the CART(0)->logo gap. --- */
+@media (max-width: 769px) {
+ body.template-collection .header-branding { padding: 14px 0; }
+ /* trim the standalone tools bar so cart isn't marooned at the top */
+ body.template-collection .header-tools-wrapper { padding-top: 4px; padding-bottom: 0; }
+ body.template-collection .header-tools { padding-top: 0; padding-bottom: 0; }
+ /* pull the logo+icons row up closer to the cart row */
+ body.template-collection .header-main-content { padding-top: 4px; }
+}
+
+/* <<< dw-collection-hero-fix END <<< */
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_dw-hero-rotator.js.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_dw-hero-rotator.js.pushbak
new file mode 100644
index 00000000..8b3cd8fb
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_dw-hero-rotator.js.pushbak
@@ -0,0 +1,186 @@
+/* ====================================================================
+ DW collection-page rotating new-arrivals hero — crossfade rotator.
+ Owner: vp-dw-commerce · 2026-06-23 · DTD source=A / curation=C(hybrid).
+
+ The hero slides are emitted by snippet 'dw-collection-hero-bg' into a
+ [data-dw-hero-rotator] container that the theme renders ABOVE the
+ collection header.
+
+ HYDRATION RACE FIX (2026-06-23): Boost-SD renders the collection header
+ TWICE — a STATIC theme '.collection-header' present at first paint, then
+ '.boost-sd__collection-header' that hydrates ASYNCHRONOUSLY a moment later
+ and is the band the shopper actually sees. The old code attached to
+ whichever header existed first; on a Boost page that was the static theme
+ header, so the slides were relocated into an INVISIBLE container and the
+ rotator never re-homed when Boost appeared -> flat black hero band.
+
+ This script now runs a DURABLE attach loop that:
+ 1. ALWAYS prefers the Boost header ('.boost-sd__collection-header').
+ 2. If the rotator currently lives in the THEME header and the Boost
+ header later hydrates, RE-HOMES the SAME rotator node into the Boost
+ header (tears down the timer, moves the node, restarts) — never clones.
+ 3. Only accepts the theme '.collection-header' as the FINAL home after a
+ ~4s grace if Boost never hydrates (so any non-Boost collection page
+ still gets a hero), gated on "Boost not present on the page".
+ 4. Crossfades the slides on a timer with no layout shift.
+ 5. Preloads all slide images so a fade never reveals a blank frame.
+ 6. Honors prefers-reduced-motion (holds on frame 1, no timer).
+ 7. Pauses while the tab is hidden (Page Visibility) to save cycles.
+
+ Self-contained, dependency-free, idempotent (re-home-safe, no double-init).
+ Mobile + desktop identical (the band is responsive via CSS).
+ Remove: delete this asset + its <script> include + the snippet.
+ ==================================================================== */
+(function () {
+ 'use strict';
+ if (window.__dwHeroRotatorInit) return;
+ window.__dwHeroRotatorInit = true;
+
+ var BOOST_SEL = '.boost-sd__collection-header';
+ var THEME_SEL = '.template-collection .collection-header, .collection-header';
+ var GRACE_MS = 4000; // wait this long for Boost before using theme header
+ var startTs = Date.now();
+
+ function boostHeader() { return document.querySelector(BOOST_SEL); }
+ function themeHeader() { return document.querySelector(THEME_SEL); }
+
+ // Pick the home we should be in RIGHT NOW. Boost always wins. The theme
+ // header is only an acceptable FINAL home once Boost is provably absent
+ // past the grace window — otherwise we hold and wait for Boost to hydrate.
+ function pickHeader() {
+ var b = boostHeader();
+ if (b) return b;
+ if (Date.now() - startTs >= GRACE_MS) return themeHeader();
+ return null; // within grace, no Boost yet -> wait (don't settle on theme)
+ }
+
+ // ---- per-rotator state lives on the node so we stay idempotent ----
+ function teardown(rotator) {
+ if (rotator.__dwTimer) { clearInterval(rotator.__dwTimer); rotator.__dwTimer = null; }
+ if (rotator.__dwVisHandler) {
+ document.removeEventListener('visibilitychange', rotator.__dwVisHandler);
+ rotator.__dwVisHandler = null;
+ }
+ }
+
+ function homeInto(rotator, header) {
+ // Relocate the rotator into the header band as a full-bleed back layer.
+ rotator.style.position = 'absolute';
+ rotator.style.top = '0';
+ rotator.style.left = '0';
+ rotator.style.right = '0';
+ rotator.style.bottom = '0';
+ rotator.style.width = '100%';
+ rotator.style.height = '100%';
+ rotator.style.zIndex = '0';
+ rotator.style.pointerEvents = 'none';
+ if (getComputedStyle(header).position === 'static') {
+ header.style.position = 'relative';
+ }
+ if (rotator.parentElement !== header) {
+ header.insertBefore(rotator, header.firstChild); // MOVE the same node
+ }
+ rotator.__dwHome = header;
+ }
+
+ function startRotation(rotator) {
+ var slides = Array.prototype.slice.call(
+ rotator.querySelectorAll('.dw-hero-slide')
+ );
+ if (!slides.length) return;
+
+ // Single slide (curated-only, or rotation off) -> just show it, no timer.
+ if (slides.length === 1) {
+ slides[0].classList.add('is-active');
+ return;
+ }
+
+ // prefers-reduced-motion -> hold on frame 1, no rotation.
+ var reduce = window.matchMedia &&
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches;
+ if (reduce) {
+ slides.forEach(function (s, i) { s.classList.toggle('is-active', i === 0); });
+ return;
+ }
+
+ // Preload all slide images so a fade never reveals a blank frame.
+ slides.forEach(function (s) {
+ var m = /url\((['"]?)(.*?)\1\)/.exec(s.style.backgroundImage || '');
+ if (m && m[2]) { var pre = new Image(); pre.src = m[2]; }
+ });
+
+ var interval = parseInt(rotator.getAttribute('data-interval'), 10);
+ if (!interval || interval < 2000) interval = 5200;
+
+ var cur = 0;
+ slides.forEach(function (s, i) { s.classList.toggle('is-active', i === 0); });
+
+ function next() {
+ var nextIdx = (cur + 1) % slides.length;
+ slides[nextIdx].classList.add('is-active');
+ slides[cur].classList.remove('is-active');
+ cur = nextIdx;
+ }
+ function play() { if (!rotator.__dwTimer) rotator.__dwTimer = setInterval(next, interval); }
+ function pause() { if (rotator.__dwTimer) { clearInterval(rotator.__dwTimer); rotator.__dwTimer = null; } }
+
+ rotator.__dwVisHandler = function () {
+ if (document.hidden) pause(); else play();
+ };
+ document.addEventListener('visibilitychange', rotator.__dwVisHandler);
+ if (!document.hidden) play();
+ }
+
+ // Idempotent + re-home-safe. Returns true only when the rotator is HOMED in
+ // its FINAL container (Boost, or the theme header after the grace window) so
+ // the caller can stop polling. Returns false while still waiting for Boost,
+ // or after a non-final re-home into the theme header (keep watching for Boost).
+ function attach() {
+ var rotator = document.querySelector('[data-dw-hero-rotator]');
+ if (!rotator) return false;
+
+ var header = pickHeader();
+ if (!header) return false; // within grace, Boost not up yet -> keep waiting
+
+ var isBoost = header === boostHeader() && header.matches(BOOST_SEL);
+
+ if (rotator.__dwHome === header) {
+ // Already homed here. Done only if this is the Boost header (final) or
+ // the grace window has elapsed (theme header is now final).
+ return isBoost || (Date.now() - startTs >= GRACE_MS);
+ }
+
+ // New/changed home. If we were already running in a non-Boost home and are
+ // now moving to Boost, tear down before relocating the SAME node.
+ var wasStarted = !!rotator.__dwHome;
+ if (wasStarted) teardown(rotator);
+
+ homeInto(rotator, header);
+ startRotation(rotator);
+
+ // If we just homed into Boost, we're final -> stop polling. If we homed
+ // into the theme header, only treat it as final once the grace elapsed
+ // with no Boost; otherwise keep watching so Boost can take over.
+ return isBoost || (Date.now() - startTs >= GRACE_MS && !boostHeader());
+ }
+
+ function init() {
+ if (attach()) return;
+ var tries = 0;
+ var mo = new MutationObserver(function () {
+ if (attach() || ++tries > 240) mo.disconnect();
+ });
+ mo.observe(document.documentElement, { childList: true, subtree: true });
+ // Safety poll (~15s) in case the Boost header swaps in without a mutation
+ // we catch, and to fire the post-grace theme-header fallback on time.
+ var poll = setInterval(function () {
+ if (attach() || ++tries > 240) clearInterval(poll);
+ }, 250);
+ }
+
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', init);
+ } else {
+ init();
+ }
+})();
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_grid.js.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_grid.js.pushbak
new file mode 100644
index 00000000..f07bea78
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/assets_grid.js.pushbak
@@ -0,0 +1,1037 @@
+/*
+ * ATTENTION: An "eval-source-map" devtool has been used.
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./node_modules/@pixelunion/age-gate/dist/index.es.js":
+/*!************************************************************!*\
+ !*** ./node_modules/@pixelunion/age-gate/dist/index.es.js ***!
+ \************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PageAgeGate\": () => (/* binding */ PageAgeGate),\n/* harmony export */ \"SiteAgeGate\": () => (/* binding */ SiteAgeGate)\n/* harmony export */ });\n\n/*!\n * @pixelunion/age-gate v1.1.2\n * (c) 2025 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\n\nvar scrollLock = __webpack_require__(/*! scroll-lock */ \"./node_modules/scroll-lock/dist/scroll-lock.js\");\nvar isbot = __webpack_require__(/*! isbot */ \"./node_modules/isbot/index.js\");\nfunction getAge(birthdate) {\n var today = new Date();\n var age = today.getFullYear() - birthdate.getFullYear();\n var m = today.getMonth() - birthdate.getMonth();\n if (m < 0 || m === 0 && today.getDate() < birthdate.getDate()) {\n age--;\n }\n return age;\n}\nvar SiteAgeGate = /*#__PURE__*/function () {\n function SiteAgeGate(el) {\n _classCallCheck(this, SiteAgeGate);\n this._el = el;\n this._ageGateForm = el.querySelector('[data-age-gate]');\n this._ageGateErrorEl = this._ageGateForm.querySelector('[data-age-gate-error]');\n this._requiredAge = this._ageGateForm.dataset.requiredAge;\n this._el.addEventListener('age-gate:open', this._open.bind(this));\n this._el.addEventListener('age-gate:close', this._close.bind(this));\n this._ageGateForm.addEventListener('submit', this._onFormSubmit.bind(this));\n if (isbot(navigator.userAgent)) {\n this._close();\n } else if (this._el.style.display === '') {\n this._open();\n }\n }\n _createClass(SiteAgeGate, [{\n key: \"_open\",\n value: function _open() {\n scrollLock.disablePageScroll();\n this._el.style.display = '';\n }\n }, {\n key: \"_close\",\n value: function _close() {\n scrollLock.enablePageScroll();\n this._el.style.display = 'none';\n }\n }, {\n key: \"_onFormSubmit\",\n value: function _onFormSubmit(event) {\n event.preventDefault();\n event.stopPropagation();\n var data = new FormData(event.target);\n var day = data.get('day');\n var month = data.get('month');\n var year = data.get('year');\n if (day === '' || month === '' || year === '') return;\n var age = getAge(new Date(year, month, day));\n if (age >= this._requiredAge) {\n this._close();\n sessionStorage.setItem('age-gate', age);\n } else {\n this._ageGateErrorEl.style.display = '';\n }\n }\n }]);\n return SiteAgeGate;\n}();\n\nvar PageAgeGate = /*#__PURE__*/function () {\n function PageAgeGate() {\n _classCallCheck(this, PageAgeGate);\n this._ageGateEl = document.getElementById('age-gate-page');\n }\n _createClass(PageAgeGate, [{\n key: \"onSectionLoad\",\n value: function onSectionLoad() {\n var openEvent = new CustomEvent('age-gate:open');\n if (this._ageGateEl) {\n this._ageGateEl.dispatchEvent(openEvent);\n }\n }\n }, {\n key: \"onSectionSelect\",\n value: function onSectionSelect() {\n var openEvent = new CustomEvent('age-gate:open');\n if (this._ageGateEl) {\n this._ageGateEl.dispatchEvent(openEvent);\n }\n }\n }, {\n key: \"onSectionDeselect\",\n value: function onSectionDeselect() {\n var closeEvent = new CustomEvent('age-gate:close');\n if (this._ageGateEl) {\n this._ageGateEl.dispatchEvent(closeEvent);\n }\n }\n }]);\n return PageAgeGate;\n}();\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYWdlLWdhdGUvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYWdlLWdhdGUvZGlzdC9pbmRleC5lcy5qcz9hYWY3Il0sInNvdXJjZXNDb250ZW50IjpbIlxuLyohXG4gKiBAcGl4ZWx1bmlvbi9hZ2UtZ2F0ZSB2MS4xLjJcbiAqIChjKSAyMDI1IFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxudmFyIHNjcm9sbExvY2sgPSByZXF1aXJlKCdzY3JvbGwtbG9jaycpO1xudmFyIGlzYm90ID0gcmVxdWlyZSgnaXNib3QnKTtcbmZ1bmN0aW9uIGdldEFnZShiaXJ0aGRhdGUpIHtcbiAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgdmFyIGFnZSA9IHRvZGF5LmdldEZ1bGxZZWFyKCkgLSBiaXJ0aGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG0gPSB0b2RheS5nZXRNb250aCgpIC0gYmlydGhkYXRlLmdldE1vbnRoKCk7XG4gIGlmIChtIDwgMCB8fCBtID09PSAwICYmIHRvZGF5LmdldERhdGUoKSA8IGJpcnRoZGF0ZS5nZXREYXRlKCkpIHtcbiAgICBhZ2UtLTtcbiAgfVxuICByZXR1cm4gYWdlO1xufVxudmFyIFNpdGVBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2l0ZUFnZUdhdGUoZWwpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2l0ZUFnZUdhdGUpO1xuICAgIHRoaXMuX2VsID0gZWw7XG4gICAgdGhpcy5fYWdlR2F0ZUZvcm0gPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hZ2UtZ2F0ZV0nKTtcbiAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbCA9IHRoaXMuX2FnZUdhdGVGb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFnZS1nYXRlLWVycm9yXScpO1xuICAgIHRoaXMuX3JlcXVpcmVkQWdlID0gdGhpcy5fYWdlR2F0ZUZvcm0uZGF0YXNldC5yZXF1aXJlZEFnZTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpvcGVuJywgdGhpcy5fb3Blbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpjbG9zZScsIHRoaXMuX2Nsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2FnZUdhdGVGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuX29uRm9ybVN1Ym1pdC5iaW5kKHRoaXMpKTtcbiAgICBpZiAoaXNib3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xuICAgICAgdGhpcy5fb3BlbigpO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoU2l0ZUFnZUdhdGUsIFt7XG4gICAga2V5OiBcIl9vcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vcGVuKCkge1xuICAgICAgc2Nyb2xsTG9jay5kaXNhYmxlUGFnZVNjcm9sbCgpO1xuICAgICAgdGhpcy5fZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Nsb3NlKCkge1xuICAgICAgc2Nyb2xsTG9jay5lbmFibGVQYWdlU2Nyb2xsKCk7XG4gICAgICB0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25Gb3JtU3VibWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkZvcm1TdWJtaXQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciBkYXRhID0gbmV3IEZvcm1EYXRhKGV2ZW50LnRhcmdldCk7XG4gICAgICB2YXIgZGF5ID0gZGF0YS5nZXQoJ2RheScpO1xuICAgICAgdmFyIG1vbnRoID0gZGF0YS5nZXQoJ21vbnRoJyk7XG4gICAgICB2YXIgeWVhciA9IGRhdGEuZ2V0KCd5ZWFyJyk7XG4gICAgICBpZiAoZGF5ID09PSAnJyB8fCBtb250aCA9PT0gJycgfHwgeWVhciA9PT0gJycpIHJldHVybjtcbiAgICAgIHZhciBhZ2UgPSBnZXRBZ2UobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpO1xuICAgICAgaWYgKGFnZSA+PSB0aGlzLl9yZXF1aXJlZEFnZSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdhZ2UtZ2F0ZScsIGFnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTaXRlQWdlR2F0ZTtcbn0oKTtcblxudmFyIFBhZ2VBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGFnZUFnZUdhdGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhZ2VBZ2VHYXRlKTtcbiAgICB0aGlzLl9hZ2VHYXRlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlLWdhdGUtcGFnZScpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhQYWdlQWdlR2F0ZSwgW3tcbiAgICBrZXk6IFwib25TZWN0aW9uTG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25Mb2FkKCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25TZWxlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uU2VsZWN0KCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25EZXNlbGVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25EZXNlbGVjdCgpIHtcbiAgICAgIHZhciBjbG9zZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdhZ2UtZ2F0ZTpjbG9zZScpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChjbG9zZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFBhZ2VBZ2VHYXRlO1xufSgpO1xuXG5leHBvcnQgeyBQYWdlQWdlR2F0ZSwgU2l0ZUFnZUdhdGUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/age-gate/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/animations/dist/animations.es.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@pixelunion/animations/dist/animations.es.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Animation\": () => (/* binding */ Animation),\n/* harmony export */ \"AnimationsManager\": () => (/* binding */ AnimationsManager),\n/* harmony export */ \"animation\": () => (/* binding */ animation),\n/* harmony export */ \"transition\": () => (/* binding */ transition)\n/* harmony export */ });\n\n /*!\n * @pixelunion/animations v0.1.0\n * (c) 2019 Pixel Union\n * Released under the UNLICENSED license.\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(source, true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(source).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n/**\n * Promisified version of window.requestAnimationFrame.\n * @returns {Promise} Promise will resolve when requestAnimationFrame callback is run.\n */\nfunction raf() {\n return new Promise(function (resolve) {\n window.requestAnimationFrame(resolve);\n });\n}\n/**\n * Represents an HTML element with associate states\n */\n\n\nvar Animation =\n/*#__PURE__*/\nfunction () {\n /**\n * @param {Object} options\n * @param {HTMLElement} options.el Target element\n * @param {String} [options.state=initial] Initial state. This is also the default state.\n * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to\n * update with change of state.\n * @param {String} [options.endEvent=transitionend] Event to listen for at end of state change.\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n * next state change.\n * @param {Function} [options.onStart] Callback to execute immediate after\n * applying stateChangeAttribute.\n */\n function Animation(options) {\n _classCallCheck(this, Animation);\n\n this._el = options.el;\n this.cancelRunning = null;\n this._state = options.state || 'initial';\n this.initialState = this._state;\n this.stateAttribute = options.stateAttribute || 'data-animation-state';\n this.stateChangeAttribute = options.stateChangeAttribute || 'data-animation';\n this.endEvent = options.endEvent || 'transitionend';\n this.hold = !!options.hold;\n\n this.onStart = options.onStart || function () {\n /* do nothing */\n };\n\n this.activeEventHandler = null;\n }\n /**\n * Returns target element\n *\n * @return {HTMLElement} Target element\n */\n\n\n _createClass(Animation, [{\n key: \"isState\",\n\n /**\n * Check if a state is active\n * @param {String} state State to compare\n *\n * @return {Boolean}\n */\n value: function isState(state) {\n return state === this._state;\n }\n /**\n * Sequences a change to a new state.\n * @param {String} state Target state\n *\n * @param {Boolean} options.force Switch to final state immediately\n *\n * @param {Function} options.onStart Callback to execute immediately after\n * applying stateChangeAttribute for this state change only.\n *\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n * next state change.\n *\n * @return {Promise} Resolves when endEvent triggered\n */\n\n }, {\n key: \"animateTo\",\n value: function animateTo(state) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var from = this._el.dataset[this.stateAttribute] || this._state;\n var to = state || this.initialState;\n var force = options.force;\n var hold = 'hold' in options ? options.hold : this.hold;\n return new Promise(function (resolve) {\n if (_this.cancelRunning) {\n _this.cancelRunning();\n }\n\n if (from === to) {\n // Removing this here fixes some lingering attributes. But why?\n _this._el.removeAttribute(_this.stateChangeAttribute);\n\n resolve(from, null);\n return;\n }\n\n var running = true;\n\n _this.cancelRunning = function () {\n running = false;\n resolve(null, null);\n };\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this.activeEventHandler = null;\n\n if (force) {\n _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n _this.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n\n if (typeof options.onStart === 'function') {\n options.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n }\n\n _this._el.setAttribute(_this.stateAttribute, to);\n\n _this._state = to;\n\n if (!hold) {\n _this._el.removeAttribute(_this.stateChangeAttribute);\n }\n\n resolve(to, null);\n return;\n }\n\n raf().then(function () {\n if (!running) throw new Error('cancelled');\n\n _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n _this.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n\n if (typeof options.onStart === 'function') {\n options.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n }\n\n return raf();\n }).then(function () {\n if (!running) throw new Error('cancelled');\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this.activeEventHandler = function (e) {\n // Ignore any events bubbling up\n if (e.target !== _this._el || !running) return;\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n if (!hold) {\n _this._el.removeAttribute(_this.stateChangeAttribute);\n }\n\n resolve(to, e);\n };\n\n _this._el.addEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this._el.setAttribute(_this.stateAttribute, to);\n\n _this._state = to;\n })[\"catch\"](function (error) {\n // Only catch 'cancelled' errors.\n if (error.message !== 'cancelled') throw error;\n });\n });\n }\n /**\n * Remove any event listeners\n */\n\n }, {\n key: \"unload\",\n value: function unload() {\n this._el.removeEventListener(this.endEvent, this.activeEventHandler);\n\n this.activeEventHandler = null;\n }\n }, {\n key: \"el\",\n get: function get() {\n return this._el;\n }\n /**\n * Returns current state\n *\n * @return {String} Current state\n */\n\n }, {\n key: \"state\",\n get: function get() {\n return this._state;\n }\n }]);\n\n return Animation;\n}();\n\n/**\n * Manage state changes for a set of elements\n */\n\nvar AnimationsManager =\n/*#__PURE__*/\nfunction () {\n function AnimationsManager() {\n _classCallCheck(this, AnimationsManager);\n\n this.animations = new Map();\n }\n /**\n * Add a new element and return an animation for that element. If element already has an associated animation, return that animation.\n * @param {Object} options\n * @param {HTMLElement} options.el Target element\n * @param {String} [options.state=initial] Initial state. This is also the default state.\n * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to update with change of state.\n * @param {String} [options.endEvent=transitionend] Event name to listen for at end of state change.\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the next state change.\n * @param {Function} [options.onStart] Callback to execute immediate after applying stateChangeAttribute.\n *\n * @return {Animation}\n */\n\n\n _createClass(AnimationsManager, [{\n key: \"add\",\n value: function add(options) {\n if (this.animations.has(options.el)) return this.animations.get(options.el);\n var animation = new Animation(options);\n this.animations.set(options.el, animation);\n return animation;\n }\n /**\n * Remove a single animation\n * @param {Animation} animation Animation to remove. Any event listeners will also be removed.\n */\n\n }, {\n key: \"remove\",\n value: function remove(animation) {\n this.animations[\"delete\"](animation.el);\n animation.unload();\n }\n /**\n * Remove all animations, including all event listeners.\n */\n\n }, {\n key: \"removeAll\",\n value: function removeAll() {\n this.animations.forEach(function (animation) {\n return animation.unload();\n });\n }\n }]);\n\n return AnimationsManager;\n}();\n\nfunction animation(options) {\n var setOptions = {\n endEvent: 'animationend',\n hold: true\n };\n return new Animation(_objectSpread2({\n options: options\n }, setOptions));\n}\n\nfunction transition(options) {\n return new Animation(options);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYW5pbWF0aW9ucy9kaXN0L2FuaW1hdGlvbnMuZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL2FuaW1hdGlvbnMvZGlzdC9hbmltYXRpb25zLmVzLmpzP2U5NTciXSwic291cmNlc0NvbnRlbnQiOlsiXG4gIC8qIVxuICAgKiBAcGl4ZWx1bmlvbi9hbmltYXRpb25zIHYwLjEuMFxuICAgKiAoYykgMjAxOSBQaXhlbCBVbmlvblxuICAgKiBSZWxlYXNlZCB1bmRlciB0aGUgVU5MSUNFTlNFRCBsaWNlbnNlLlxuICAqL1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKHNvdXJjZSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogUHJvbWlzaWZpZWQgdmVyc2lvbiBvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGNhbGxiYWNrIGlzIHJ1bi5cbiAqL1xuZnVuY3Rpb24gcmFmKCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUpO1xuICB9KTtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBIVE1MIGVsZW1lbnQgd2l0aCBhc3NvY2lhdGUgc3RhdGVzXG4gKi9cblxuXG52YXIgQW5pbWF0aW9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBvcHRpb25zLmVsIFRhcmdldCBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZT1pbml0aWFsXSBJbml0aWFsIHN0YXRlLiBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZUF0dHJpYnV0ZT1kYXRhLXJldmVhbGVyXSBBdHRyaWJ1dGUgbmFtZSB0byB1cGRhdGUgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlQ2hhbmdlQXR0cmlidXRlPWRhdGEtcmV2ZWFsZXItdHJhbnNpdGlvbl0gQXR0cmlidXRlIG5hbWUgdG9cbiAgICogdXBkYXRlIHdpdGggY2hhbmdlIG9mIHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZW5kRXZlbnQ9dHJhbnNpdGlvbmVuZF0gRXZlbnQgdG8gbGlzdGVuIGZvciBhdCBlbmQgb2Ygc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvbGQ9ZmFsc2VdIElmIHRydWUsIGNoYW5nZUF0dHJpYnV0ZSB3aWxsIG5vdCBiZSByZW1vdmVkIHVudGlsIHRoZVxuICAgKiBuZXh0IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25TdGFydF0gQ2FsbGJhY2sgdG8gZXhlY3V0ZSBpbW1lZGlhdGUgYWZ0ZXJcbiAgICogYXBwbHlpbmcgc3RhdGVDaGFuZ2VBdHRyaWJ1dGUuXG4gICAqL1xuICBmdW5jdGlvbiBBbmltYXRpb24ob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRpb24pO1xuXG4gICAgdGhpcy5fZWwgPSBvcHRpb25zLmVsO1xuICAgIHRoaXMuY2FuY2VsUnVubmluZyA9IG51bGw7XG4gICAgdGhpcy5fc3RhdGUgPSBvcHRpb25zLnN0YXRlIHx8ICdpbml0aWFsJztcbiAgICB0aGlzLmluaXRpYWxTdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgIHRoaXMuc3RhdGVBdHRyaWJ1dGUgPSBvcHRpb25zLnN0YXRlQXR0cmlidXRlIHx8ICdkYXRhLWFuaW1hdGlvbi1zdGF0ZSc7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSA9IG9wdGlvbnMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUgfHwgJ2RhdGEtYW5pbWF0aW9uJztcbiAgICB0aGlzLmVuZEV2ZW50ID0gb3B0aW9ucy5lbmRFdmVudCB8fCAndHJhbnNpdGlvbmVuZCc7XG4gICAgdGhpcy5ob2xkID0gISFvcHRpb25zLmhvbGQ7XG5cbiAgICB0aGlzLm9uU3RhcnQgPSBvcHRpb25zLm9uU3RhcnQgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgIH07XG5cbiAgICB0aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGFyZ2V0IGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9IFRhcmdldCBlbGVtZW50XG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEFuaW1hdGlvbiwgW3tcbiAgICBrZXk6IFwiaXNTdGF0ZVwiLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzdGF0ZSBpcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUgU3RhdGUgdG8gY29tcGFyZVxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNTdGF0ZShzdGF0ZSkge1xuICAgICAgcmV0dXJuIHN0YXRlID09PSB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VxdWVuY2VzIGEgY2hhbmdlIHRvIGEgbmV3IHN0YXRlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZSBUYXJnZXQgc3RhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5mb3JjZSBTd2l0Y2ggdG8gZmluYWwgc3RhdGUgaW1tZWRpYXRlbHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMub25TdGFydCBDYWxsYmFjayB0byBleGVjdXRlIGltbWVkaWF0ZWx5IGFmdGVyXG4gICAgICogYXBwbHlpbmcgc3RhdGVDaGFuZ2VBdHRyaWJ1dGUgZm9yIHRoaXMgc3RhdGUgY2hhbmdlIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvbGQ9ZmFsc2VdIElmIHRydWUsIGNoYW5nZUF0dHJpYnV0ZSB3aWxsIG5vdCBiZSByZW1vdmVkIHVudGlsIHRoZVxuICAgICAqIG5leHQgc3RhdGUgY2hhbmdlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBlbmRFdmVudCB0cmlnZ2VyZWRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFuaW1hdGVUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhbmltYXRlVG8oc3RhdGUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBmcm9tID0gdGhpcy5fZWwuZGF0YXNldFt0aGlzLnN0YXRlQXR0cmlidXRlXSB8fCB0aGlzLl9zdGF0ZTtcbiAgICAgIHZhciB0byA9IHN0YXRlIHx8IHRoaXMuaW5pdGlhbFN0YXRlO1xuICAgICAgdmFyIGZvcmNlID0gb3B0aW9ucy5mb3JjZTtcbiAgICAgIHZhciBob2xkID0gJ2hvbGQnIGluIG9wdGlvbnMgPyBvcHRpb25zLmhvbGQgOiB0aGlzLmhvbGQ7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKF90aGlzLmNhbmNlbFJ1bm5pbmcpIHtcbiAgICAgICAgICBfdGhpcy5jYW5jZWxSdW5uaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAvLyBSZW1vdmluZyB0aGlzIGhlcmUgZml4ZXMgc29tZSBsaW5nZXJpbmcgYXR0cmlidXRlcy4gQnV0IHdoeT9cbiAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlQXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlKTtcblxuICAgICAgICAgIHJlc29sdmUoZnJvbSwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJ1bm5pbmcgPSB0cnVlO1xuXG4gICAgICAgIF90aGlzLmNhbmNlbFJ1bm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJlc29sdmUobnVsbCwgbnVsbCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDtcblxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlLCBcIlwiLmNvbmNhdChmcm9tLCBcIj0+XCIpLmNvbmNhdCh0bykpO1xuXG4gICAgICAgICAgX3RoaXMub25TdGFydCh7XG4gICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdGFydCh7XG4gICAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUF0dHJpYnV0ZSwgdG8pO1xuXG4gICAgICAgICAgX3RoaXMuX3N0YXRlID0gdG87XG5cbiAgICAgICAgICBpZiAoIWhvbGQpIHtcbiAgICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUodG8sIG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhZigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghcnVubmluZykgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcblxuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUsIFwiXCIuY29uY2F0KGZyb20sIFwiPT5cIikuY29uY2F0KHRvKSk7XG5cbiAgICAgICAgICBfdGhpcy5vblN0YXJ0KHtcbiAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25TdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3B0aW9ucy5vblN0YXJ0KHtcbiAgICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmFmKCk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghcnVubmluZykgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcblxuICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBhbnkgZXZlbnRzIGJ1YmJsaW5nIHVwXG4gICAgICAgICAgICBpZiAoZS50YXJnZXQgIT09IF90aGlzLl9lbCB8fCAhcnVubmluZykgcmV0dXJuO1xuXG4gICAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgICAgaWYgKCFob2xkKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRvLCBlKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgX3RoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQXR0cmlidXRlLCB0byk7XG5cbiAgICAgICAgICBfdGhpcy5fc3RhdGUgPSB0bztcbiAgICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBPbmx5IGNhdGNoICdjYW5jZWxsZWQnIGVycm9ycy5cbiAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSAhPT0gJ2NhbmNlbGxlZCcpIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW55IGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5sb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5lbmRFdmVudCwgdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICB0aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY3VycmVudCBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDdXJyZW50IHN0YXRlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdGF0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRpb247XG59KCk7XG5cbi8qKlxuICogTWFuYWdlIHN0YXRlIGNoYW5nZXMgZm9yIGEgc2V0IG9mIGVsZW1lbnRzXG4gKi9cblxudmFyIEFuaW1hdGlvbnNNYW5hZ2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQW5pbWF0aW9uc01hbmFnZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGlvbnNNYW5hZ2VyKTtcblxuICAgIHRoaXMuYW5pbWF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IGVsZW1lbnQgYW5kIHJldHVybiBhbiBhbmltYXRpb24gZm9yIHRoYXQgZWxlbWVudC4gSWYgZWxlbWVudCBhbHJlYWR5IGhhcyBhbiBhc3NvY2lhdGVkIGFuaW1hdGlvbiwgcmV0dXJuIHRoYXQgYW5pbWF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSAgb3B0aW9ucy5lbCBUYXJnZXQgZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGU9aW5pdGlhbF0gSW5pdGlhbCBzdGF0ZS4gVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlcl0gQXR0cmlidXRlIG5hbWUgdG8gdXBkYXRlIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZT1kYXRhLXJldmVhbGVyLXRyYW5zaXRpb25dIEF0dHJpYnV0ZSBuYW1lIHRvIHVwZGF0ZSB3aXRoIGNoYW5nZSBvZiBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVuZEV2ZW50PXRyYW5zaXRpb25lbmRdIEV2ZW50IG5hbWUgdG8gbGlzdGVuIGZvciBhdCBlbmQgb2Ygc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvbGQ9ZmFsc2VdIElmIHRydWUsIGNoYW5nZUF0dHJpYnV0ZSB3aWxsIG5vdCBiZSByZW1vdmVkIHVudGlsIHRoZSBuZXh0IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25TdGFydF0gQ2FsbGJhY2sgdG8gZXhlY3V0ZSBpbW1lZGlhdGUgYWZ0ZXIgYXBwbHlpbmcgc3RhdGVDaGFuZ2VBdHRyaWJ1dGUuXG4gICAqXG4gICAqIEByZXR1cm4ge0FuaW1hdGlvbn1cbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0aW9uc01hbmFnZXIsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQob3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9ucy5oYXMob3B0aW9ucy5lbCkpIHJldHVybiB0aGlzLmFuaW1hdGlvbnMuZ2V0KG9wdGlvbnMuZWwpO1xuICAgICAgdmFyIGFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24ob3B0aW9ucyk7XG4gICAgICB0aGlzLmFuaW1hdGlvbnMuc2V0KG9wdGlvbnMuZWwsIGFuaW1hdGlvbik7XG4gICAgICByZXR1cm4gYW5pbWF0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBzaW5nbGUgYW5pbWF0aW9uXG4gICAgICogQHBhcmFtIHtBbmltYXRpb259IGFuaW1hdGlvbiBBbmltYXRpb24gdG8gcmVtb3ZlLiBBbnkgZXZlbnQgbGlzdGVuZXJzIHdpbGwgYWxzbyBiZSByZW1vdmVkLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShhbmltYXRpb24pIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc1tcImRlbGV0ZVwiXShhbmltYXRpb24uZWwpO1xuICAgICAgYW5pbWF0aW9uLnVubG9hZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGFuaW1hdGlvbnMsIGluY2x1ZGluZyBhbGwgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlQWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUFsbCgpIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbi51bmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRpb25zTWFuYWdlcjtcbn0oKTtcblxuZnVuY3Rpb24gYW5pbWF0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIHNldE9wdGlvbnMgPSB7XG4gICAgZW5kRXZlbnQ6ICdhbmltYXRpb25lbmQnLFxuICAgIGhvbGQ6IHRydWVcbiAgfTtcbiAgcmV0dXJuIG5ldyBBbmltYXRpb24oX29iamVjdFNwcmVhZDIoe1xuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfSwgc2V0T3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBBbmltYXRpb24ob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IEFuaW1hdGlvbiwgQW5pbWF0aW9uc01hbmFnZXIsIGFuaW1hdGlvbiwgdHJhbnNpdGlvbiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/animations/dist/animations.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/events/dist/EventHandler.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/@pixelunion/events/dist/EventHandler.js ***!
+ \**************************************************************/
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+eval("\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n function EventHandler() {\n this.events = [];\n }\n EventHandler.prototype.register = function (el, event, listener) {\n if (!el || !event || !listener)\n return null;\n this.events.push({ el: el, event: event, listener: listener });\n el.addEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregister = function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n if (!el || !event || !listener)\n return null;\n this.events = this.events.filter(function (e) { return el !== e.el\n || event !== e.event || listener !== e.listener; });\n el.removeEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregisterAll = function () {\n this.events.forEach(function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n return el.removeEventListener(event, listener);\n });\n this.events = [];\n };\n return EventHandler;\n}());\nexports.default = EventHandler;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZXZlbnRzL2Rpc3QvRXZlbnRIYW5kbGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9ldmVudHMvZGlzdC9FdmVudEhhbmRsZXIuanM/ZDU5OSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgRXZlbnRIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV2ZW50SGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uIChlbCwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghZWwgfHwgIWV2ZW50IHx8ICFsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9KTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4geyBlbDogZWwsIGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gICAgfTtcbiAgICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGVsID0gX2EuZWwsIGV2ZW50ID0gX2EuZXZlbnQsIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICAgIGlmICghZWwgfHwgIWV2ZW50IHx8ICFsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IHRoaXMuZXZlbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZWwgIT09IGUuZWxcbiAgICAgICAgICAgIHx8IGV2ZW50ICE9PSBlLmV2ZW50IHx8IGxpc3RlbmVyICE9PSBlLmxpc3RlbmVyOyB9KTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4geyBlbDogZWwsIGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gICAgfTtcbiAgICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnVucmVnaXN0ZXJBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfYS5lbCwgZXZlbnQgPSBfYS5ldmVudCwgbGlzdGVuZXIgPSBfYS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHJldHVybiBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcbn0oKSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50SGFuZGxlcjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/events/dist/EventHandler.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/grouped-content/dist/index.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/@pixelunion/grouped-content/dist/index.js ***!
+ \****************************************************************/
+/***/ ((module) => {
+
+"use strict";
+eval("\n\n// forEach method, could be shipped as part of an Object Literal/Module\nfunction forEach(array, callback, scope) {\n var index = 0;\n\n for (index = 0; index < array.length; index += 1) {\n callback.call(scope, array[index], index); // passes back stuff we need\n }\n}\n\nfunction hasClass(el, className) {\n var regex = new RegExp('^' + className + '| +' + className, 'g');\n\n return el.className.match(regex);\n}\n\nfunction addClass(el, className) {\n // Return if it already has the className\n if (hasClass(el, className)) return;\n\n el.className += ' ' + className;\n}\n\nfunction removeClass(el, className) {\n // Return if it doesn't already have the className\n if (!hasClass(el, className)) return;\n\n var regex = new RegExp('^' + className + '| +' + className, 'g');\n\n el.className = el.className.replace(regex, '');\n}\n\nfunction toggleClass(el, className) {\n if (hasClass(el, className)) {\n removeClass(el, className);\n } else {\n addClass(el, className);\n }\n}\n\nfunction findPairingFromPairingTrigger(pairings, pairingTrigger) {\n var foundPairing = null;\n\n forEach(pairings, function (pairing) {\n if (pairing.trigger === pairingTrigger) {\n foundPairing = pairing;\n }\n });\n\n return foundPairing;\n}\n\n/**\n * See {@link https://stackoverflow.com/revisions/2117523/11 Stack Overflow}\n * An RFC4122 v4 compliant uuid solution\n */\nfunction uuidv4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0;\n var v = c === 'x' ? r : r & 0x3 | 0x8;\n\n return v.toString(16);\n });\n}\n\nfunction init(groupedContent) {\n var triggers = groupedContent.triggers;\n var pairings = groupedContent.pairings;\n\n triggers.setAttribute('role', 'tablist');\n\n forEach(pairings, function (pairing, index) {\n pairing.trigger.setAttribute('role', 'tab');\n pairing.trigger.setAttribute('aria-controls', groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content');\n\n var triggerContent = pairing.trigger.innerHTML;\n var triggerWrapper = document.createElement('span');\n triggerWrapper.innerHTML = triggerContent;\n\n pairing.trigger.innerHTML = '';\n pairing.trigger.appendChild(triggerWrapper);\n\n if (pairing.trigger.children.length > 0) {\n forEach(pairing.trigger.children, function (child) {\n child.setAttribute('tabIndex', '-1');\n });\n }\n\n if (hasClass(pairing.trigger, 'active')) {\n pairing.trigger.setAttribute('aria-selected', 'true');\n pairing.trigger.setAttribute('tabIndex', '0');\n } else {\n pairing.trigger.setAttribute('tabIndex', '-1');\n }\n\n pairing.content.id = groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content';\n pairing.content.setAttribute('role', 'tabpanel');\n\n if (!hasClass(pairing.content, 'active')) {\n pairing.content.setAttribute('aria-hidden', 'true');\n }\n });\n}\n\nfunction update(groupedContent) {\n var pairings = groupedContent.pairings;\n\n forEach(pairings, function (pairing) {\n pairing.trigger.removeAttribute('aria-selected');\n pairing.content.removeAttribute('aria-hidden');\n\n if (hasClass(pairing.trigger, 'active')) {\n pairing.trigger.setAttribute('aria-selected', 'true');\n pairing.trigger.setAttribute('tabIndex', '0');\n } else {\n pairing.trigger.setAttribute('tabIndex', '-1');\n }\n\n if (!hasClass(pairing.content, 'active')) {\n pairing.content.setAttribute('aria-hidden', 'true');\n }\n });\n}\n\nvar a11y = {\n init: init,\n update: update\n};\n\nvar asyncGenerator = function () {\n function AwaitValue(value) {\n this.value = value;\n }\n\n function AsyncGenerator(gen) {\n var front, back;\n\n function send(key, arg) {\n return new Promise(function (resolve, reject) {\n var request = {\n key: key,\n arg: arg,\n resolve: resolve,\n reject: reject,\n next: null\n };\n\n if (back) {\n back = back.next = request;\n } else {\n front = back = request;\n resume(key, arg);\n }\n });\n }\n\n function resume(key, arg) {\n try {\n var result = gen[key](arg);\n var value = result.value;\n\n if (value instanceof AwaitValue) {\n Promise.resolve(value.value).then(function (arg) {\n resume(\"next\", arg);\n }, function (arg) {\n resume(\"throw\", arg);\n });\n } else {\n settle(result.done ? \"return\" : \"normal\", result.value);\n }\n } catch (err) {\n settle(\"throw\", err);\n }\n }\n\n function settle(type, value) {\n switch (type) {\n case \"return\":\n front.resolve({\n value: value,\n done: true\n });\n break;\n\n case \"throw\":\n front.reject(value);\n break;\n\n default:\n front.resolve({\n value: value,\n done: false\n });\n break;\n }\n\n front = front.next;\n\n if (front) {\n resume(front.key, front.arg);\n } else {\n back = null;\n }\n }\n\n this._invoke = send;\n\n if (typeof gen.return !== \"function\") {\n this.return = undefined;\n }\n }\n\n if (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n return this;\n };\n }\n\n AsyncGenerator.prototype.next = function (arg) {\n return this._invoke(\"next\", arg);\n };\n\n AsyncGenerator.prototype.throw = function (arg) {\n return this._invoke(\"throw\", arg);\n };\n\n AsyncGenerator.prototype.return = function (arg) {\n return this._invoke(\"return\", arg);\n };\n\n return {\n wrap: function (fn) {\n return function () {\n return new AsyncGenerator(fn.apply(this, arguments));\n };\n },\n await: function (value) {\n return new AwaitValue(value);\n }\n };\n}();\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n/** A class for creating, managing, and destroying groupable content as tabs. */\n\nvar TabsLayout = function () {\n function TabsLayout(groupedContent) {\n classCallCheck(this, TabsLayout);\n\n this.groupedContent = groupedContent;\n this.pairings = groupedContent.pairings;\n this.events = [];\n\n this._handleKeydown = this._handleKeydown.bind(this);\n this._handleClick = this._handleClick.bind(this);\n\n this._init();\n a11y.init(this.groupedContent);\n }\n\n createClass(TabsLayout, [{\n key: 'unload',\n value: function unload() {\n forEach(this.events, function (event) {\n event.trigger.removeEventListener(event.type, event.fn);\n });\n }\n }, {\n key: '_init',\n value: function _init() {\n var _this = this;\n\n var existingActive = false;\n\n forEach(this.pairings, function (pairing) {\n var trigger = pairing.trigger;\n\n if (hasClass(trigger, 'active')) {\n existingActive = true;\n }\n\n trigger.addEventListener('keydown', _this._handleKeydown);\n trigger.addEventListener('click', _this._handleClick);\n\n _this.events.push({\n trigger: trigger,\n type: 'keydown',\n fn: _this._handleKeydown\n });\n\n _this.events.push({\n trigger: trigger,\n type: 'click',\n fn: _this._handleClick\n });\n });\n\n if (!existingActive) {\n addClass(this.pairings[0].trigger, 'active');\n addClass(this.pairings[0].content, 'active');\n }\n }\n }, {\n key: '_handleKeydown',\n value: function _handleKeydown(event) {\n var trigger = event.currentTarget;\n var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n var pairingIndex = this.pairings.indexOf(pairing);\n var prevIndex = pairingIndex - 1 < 0 ? this.pairings.length - 1 : pairingIndex - 1;\n var nextIndex = pairingIndex + 1 >= this.pairings.length ? 0 : pairingIndex + 1;\n\n var nextPairing = null;\n\n switch (event.key) {\n case 'ArrowLeft':\n nextPairing = this.pairings[prevIndex];\n break;\n case 'ArrowRight':\n nextPairing = this.pairings[nextIndex];\n break;\n default:\n nextPairing = null;\n break;\n }\n\n // Fast exit if we can't find the tab or tabs\n if (nextPairing === null) return;\n\n event.preventDefault();\n\n forEach(this.pairings, function (inactivePairing) {\n removeClass(inactivePairing.trigger, 'active');\n removeClass(inactivePairing.content, 'active');\n });\n\n addClass(nextPairing.trigger, 'active');\n addClass(nextPairing.content, 'active');\n\n nextPairing.trigger.focus();\n\n a11y.update(this.groupedContent);\n }\n }, {\n key: '_handleClick',\n value: function _handleClick(event) {\n var trigger = event.currentTarget;\n var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n // Fast exit if we can't find the tab or tabs\n if (pairing === null) return;\n\n event.preventDefault();\n\n forEach(this.pairings, function (inactivePairing) {\n removeClass(inactivePairing.trigger, 'active');\n removeClass(inactivePairing.content, 'active');\n });\n\n addClass(pairing.trigger, 'active');\n addClass(pairing.content, 'active');\n\n a11y.update(this.groupedContent);\n }\n }]);\n return TabsLayout;\n}();\n\nfunction init$1(groupedContent) {\n var pairings = groupedContent.pairings;\n\n forEach(pairings, function (pairing, index) {\n pairing.trigger.setAttribute('role', 'button');\n pairing.trigger.setAttribute('aria-controls', groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content');\n pairing.trigger.setAttribute('tabIndex', '0');\n\n if (pairing.trigger.children.length > 0) {\n forEach(pairing.trigger.children, function (child) {\n child.setAttribute('tabIndex', '-1');\n });\n }\n\n if (hasClass(pairing.trigger, 'active')) {\n pairing.trigger.setAttribute('aria-expanded', 'true');\n } else {\n pairing.trigger.setAttribute('aria-expanded', 'false');\n }\n\n pairing.content.id = groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content';\n\n if (!hasClass(pairing.content, 'active')) {\n pairing.content.setAttribute('aria-hidden', 'true');\n }\n });\n}\n\nfunction update$1(groupedContent) {\n var pairings = groupedContent.pairings;\n\n forEach(pairings, function (pairing) {\n pairing.content.removeAttribute('aria-hidden');\n\n if (hasClass(pairing.trigger, 'active')) {\n pairing.trigger.setAttribute('aria-expanded', 'true');\n } else {\n pairing.trigger.setAttribute('aria-expanded', 'false');\n }\n\n if (!hasClass(pairing.content, 'active')) {\n pairing.content.setAttribute('aria-hidden', 'true');\n }\n });\n}\n\nvar a11y$1 = {\n init: init$1,\n update: update$1\n};\n\n/** A class for creating, managing, and destroying groupable content as an accordion. */\n\nvar AccordionLayout = function () {\n function AccordionLayout(groupedContent) {\n classCallCheck(this, AccordionLayout);\n\n this.groupedContent = groupedContent;\n this.pairings = groupedContent.pairings;\n this.events = [];\n\n this._handleKeydown = this._handleKeydown.bind(this);\n this._handleClick = this._handleClick.bind(this);\n\n this._init(this.pairings);\n a11y$1.init(this.groupedContent);\n }\n\n createClass(AccordionLayout, [{\n key: 'unload',\n value: function unload() {\n forEach(this.events, function (event) {\n event.trigger.removeEventListener(event.type, event.fn);\n });\n }\n }, {\n key: '_init',\n value: function _init() {\n var _this = this;\n\n forEach(this.pairings, function (pairing) {\n var trigger = pairing.trigger;\n var content = pairing.content;\n\n trigger.parentNode.insertBefore(content, trigger.nextSibling);\n\n trigger.addEventListener('keydown', _this._handleKeydown);\n trigger.addEventListener('click', _this._handleClick);\n\n _this.events.push({\n trigger: trigger,\n type: 'keydown',\n fn: _this._handleKeydown\n });\n\n _this.events.push({\n trigger: trigger,\n type: 'click',\n fn: _this._handleClick\n });\n });\n\n this.groupedContent.contents.remove();\n }\n }, {\n key: '_handleKeydown',\n value: function _handleKeydown(event) {\n var trigger = event.currentTarget;\n var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n // Fast exit if enter isn't pressed or we can't find the group\n if (event.key !== 'Enter' || pairing === null) return;\n\n event.preventDefault();\n\n toggleClass(pairing.trigger, 'active');\n toggleClass(pairing.content, 'active');\n a11y$1.update(this.groupedContent);\n }\n }, {\n key: '_handleClick',\n value: function _handleClick(event) {\n var trigger = event.currentTarget;\n var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n // Fast exit if we can't find the group\n if (pairing === null) return;\n\n event.preventDefault();\n\n toggleClass(pairing.trigger, 'active');\n toggleClass(pairing.content, 'active');\n a11y$1.update(this.groupedContent);\n }\n }]);\n return AccordionLayout;\n}();\n\n/**\n * Returns an array of nodes related to the heading node.\n * @param {node} heading - The heading node to search for content from.\n * @returns {node[]}\n */\nfunction getHeadingContent(heading) {\n var headingTagNames = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n var tagNameIndex = headingTagNames.indexOf(heading.tagName);\n var content = [];\n\n var sibling = heading.nextElementSibling;\n\n while (sibling !== null && (headingTagNames.indexOf(sibling.tagName) === -1 || headingTagNames.indexOf(sibling.tagName) > tagNameIndex)) {\n content.push(sibling);\n\n sibling = sibling.nextElementSibling;\n }\n\n return content;\n}\n\n/**\n * Returns an object array representing the heading tree from a given node.\n * Root nodes are evaluated differently, and requires the evaluatingRoot flag\n * to be true.\n * @param {node} el - The node being evaluated.\n * @param {node[]} children - The children of the evaluated node.\n * @param {boolean} [evaluatingRoot] - Whether to evaluate as root node.\n * @returns {Object[]}\n */\nfunction getHeadingTree(el, children) {\n var evaluatingRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var headingTagNames = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n var tagNameIndex = headingTagNames.indexOf(el.tagName);\n var headings = [];\n\n var currentLowestTagNameIndex = 5;\n\n for (var i = 0; i < children.length; i += 1) {\n var child = children[i];\n var childTagNameIndex = headingTagNames.indexOf(child.tagName);\n\n if (childTagNameIndex !== -1 && childTagNameIndex < currentLowestTagNameIndex) {\n currentLowestTagNameIndex = childTagNameIndex;\n }\n\n if (evaluatingRoot && childTagNameIndex !== -1 && childTagNameIndex <= currentLowestTagNameIndex || !evaluatingRoot && childTagNameIndex !== -1 && childTagNameIndex === tagNameIndex + 1) {\n var siblings = getHeadingContent(child);\n\n var childNode = {\n el: child,\n content: siblings,\n children: getHeadingTree(child, siblings)\n };\n\n headings.push(childNode);\n }\n }\n\n return headings;\n}\n\n/**\n * Returns groupings of headings that meet the minimum sequence value\n * and don't contain any invalid headings.\n * @param {Object[]} headings - An array of heading objects.\n * @param {int[]} invalidHeadings - An array of invalid heading integers,\n * representing indexes of headings.\n * @param {*} minInSequence - Minimum headings in sequence before being considered\n * as a grouping.\n * @returns {Object[][]}\n */\nfunction getHeadingGroupsInSequence(headings, invalidHeadings, minInSequence) {\n var headingGroupsInSequence = [];\n var currentHeadingGroupInSequence = [];\n var currentSequence = 0;\n\n for (var i = 0; i < headings.length; i += 1) {\n if (invalidHeadings.indexOf(i) === -1) {\n currentHeadingGroupInSequence.push(headings[i]);\n currentSequence += 1;\n\n if (i !== headings.length - 1 && headings[i].el.tagName !== headings[i + 1].el.tagName && invalidHeadings.indexOf(i + 1)) {\n currentHeadingGroupInSequence = [];\n currentSequence = 0;\n } else if (i !== 0 && headings[i].el.tagName !== headings[i - 1].el.tagName) {\n currentHeadingGroupInSequence.pop();\n currentSequence -= 1;\n\n if (currentSequence >= minInSequence) {\n headingGroupsInSequence.push(currentHeadingGroupInSequence);\n }\n\n currentHeadingGroupInSequence = [headings[i]];\n currentSequence = 1;\n }\n }\n }\n\n if (currentSequence >= minInSequence) {\n headingGroupsInSequence.push(currentHeadingGroupInSequence);\n }\n\n return headingGroupsInSequence;\n}\n\n/**\n * Generates necessary DOM elements to group related content.\n * Returns a object array representing the grouped content.\n * @param {Object[]} children - An array of objects.\n * @returns {Object[]}\n */\nfunction createGroupedContent(children) {\n var pairings = [];\n\n var firstChild = children[0].el;\n var triggers = document.createElement('div');\n var contents = document.createElement('div');\n\n contents = firstChild.parentNode.insertBefore(contents, firstChild.nextSibling);\n triggers = firstChild.parentNode.insertBefore(triggers, firstChild.nextSibling);\n\n for (var i = 0; i < children.length; i += 1) {\n var child = children[i];\n var trigger = child.el;\n var content = document.createElement('div');\n\n trigger = triggers.appendChild(trigger);\n content = contents.appendChild(content);\n\n for (var j = 0; j < child.content.length; j += 1) {\n content.appendChild(child.content[j]);\n }\n\n pairings.push({\n trigger: trigger,\n content: content\n });\n }\n\n return {\n triggers: triggers,\n contents: contents,\n pairings: pairings\n };\n}\n\n/**\n * Returns all groupable content within the supplied node.\n * @param {node} node - A node to traverse for groupable content.\n * @returns {Object[][]}\n */\n/*\n * Recursive function:\n * Returns all groups of headings that\n * are elegible to become grouped content.\n */\nfunction getGroupedContentSet(node) {\n var children = node.children;\n var childrenWithGroupableContent = [];\n var groupedContentSet = [];\n\n if (children.length === 0) {\n return [];\n }\n\n for (var i = 0; i < children.length; i += 1) {\n var childGroupableContent = getGroupedContentSet(children[i]);\n\n if (childGroupableContent.length > 0) {\n childrenWithGroupableContent.push(i);\n groupedContentSet = groupedContentSet.concat(childGroupableContent);\n }\n }\n\n var headingGroupsInSequence = getHeadingGroupsInSequence(children, childrenWithGroupableContent, 3);\n\n for (var _i = 0; _i < headingGroupsInSequence.length; _i += 1) {\n groupedContentSet.push(createGroupedContent(headingGroupsInSequence[_i]));\n }\n\n return groupedContentSet;\n}\n\n/**\n * When static parsing isn't enough, there's intelliparse™!\n * Searches through dom content to find heading groupings that\n * are elegible to become tab groups.\n * Assumes that content is in a flattened hierarchy in the dom\n * and interprets increasing heading values as a deeper level of nesting.\n * Returns all groupable content as an array of object arrays.\n * @param {node} el - The node who's content will be searched for groupable content.\n * @returns {Object[][]}\n */\nfunction intelliParse(el) {\n var children = el.children;\n var heading = el.querySelector('h1, h2, h3, h4, h5, h6');\n\n // Fast return if there's no headings\n if (children.length === 0) return [];\n\n var rootNode = {\n el: el,\n content: null,\n children: getHeadingTree(heading, children, true)\n };\n\n return getGroupedContentSet(rootNode);\n}\n\n/**\n * Parses content from a given node based on a static structure.\n * The structure is as follows:\n * <ul class=\"tabs\">\n * <li class=\"active\">Tab 1</li>\n * <li>Tab 2</li>\n * <li>Tab 3</li>\n * </ul>\n *\n * <ul class=\"tabs-content\">\n * <li class=\"active\">\n * <p>Tab 1 content goes here.</p>\n * </li>\n * <li>\n * <p>Tab 2 content goes here.</p>\n * </li>\n * <li>\n * <p>Tab 3 content goes here.</p>\n * </li>\n * </ul>\n * Returns all groupable content as an array of object arrays.\n * @param {node} el - The node who's content will be searched for groupable content.\n * @returns {Object[][]}\n */\nfunction staticParse(el) {\n var groupedContentSet = [];\n\n var tabs = el.querySelectorAll('.tabs');\n\n for (var i = 0; i < tabs.length; i += 1) {\n var triggers = tabs[i].children;\n var contents = tabs[i].nextElementSibling.children;\n\n // Only add a tab group if equal triggers to contents\n if (triggers.length === contents.length) {\n var length = groupedContentSet.push({\n triggers: tabs[i],\n contents: tabs[i].nextElementSibling,\n pairings: []\n });\n var index = length - 1;\n\n for (var j = 0; j < triggers.length; j += 1) {\n var trigger = triggers[j];\n var content = contents[j];\n\n var pairing = {\n trigger: trigger,\n content: content\n };\n\n groupedContentSet[index].pairings.push(pairing);\n }\n }\n }\n\n return groupedContentSet;\n}\n\n/**\n * Returns all groupable content as an array of object arrays.\n * @param {node} content - The node to parse for groupable content.\n * @param {boolean} intelliparse - Whether to use intelligent parsing.\n * @returns {Object[][]}\n */\nfunction parse(content) {\n var intelliparse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var groupedContentSet = intelliparse ? intelliParse(content) : staticParse(content);\n\n return groupedContentSet;\n}\n\n/** A class for creating, managing, and destroying groupable content. */\n\nvar GroupedContent = function () {\n /**\n * Create grouped content\n * @param {node} el - The element to search for groupable content in.\n * @param {Object} [options] - Additional options\n * @param {string} [options.layout] - The layout to display groupable content in.\n * @param {boolean} [options.intelliparse] - The parsing algorithm used to find content with.\n */\n function GroupedContent(el) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, GroupedContent);\n\n this.namespace = 'grouped-content';\n this.el = el;\n this.groupedContentInstances = [];\n\n var layout = options.layout || 'tabs';\n var intelliparse = !!options.intelliparse;\n\n forEach(parse(el, intelliparse), function (groupedContent) {\n var id = uuidv4();\n var instance = null;\n var groupedContentWrapper = document.createElement('div');\n\n groupedContentWrapper = groupedContent.triggers.parentNode.insertBefore(groupedContentWrapper, groupedContent.triggers.nextSibling);\n\n addClass(groupedContentWrapper, _this.namespace);\n addClass(groupedContentWrapper, _this.namespace + '-layout-' + layout);\n\n groupedContentWrapper.appendChild(groupedContent.triggers);\n groupedContentWrapper.appendChild(groupedContent.contents);\n\n groupedContent.namespace = _this.namespace;\n groupedContent.id = id;\n groupedContent.triggers.id = _this.namespace + '-' + id + '-triggers';\n groupedContent.contents.id = _this.namespace + '-' + id + '-contents';\n\n addClass(groupedContent.triggers, _this.namespace + '-triggers');\n addClass(groupedContent.contents, _this.namespace + '-contents');\n\n forEach(groupedContent.pairings, function (pairing) {\n addClass(pairing.trigger, _this.namespace + '-trigger');\n addClass(pairing.content, _this.namespace + '-content');\n });\n\n switch (layout) {\n case 'accordion':\n instance = new AccordionLayout(groupedContent);\n break;\n case 'tabs':\n default:\n instance = new TabsLayout(groupedContent);\n break;\n }\n\n _this.groupedContentInstances.push({\n groupedContent: groupedContent,\n instance: instance\n });\n });\n }\n\n /** Unload all grouped content instances */\n\n\n createClass(GroupedContent, [{\n key: 'unload',\n value: function unload() {\n forEach(this.groupedContentInstances, function (groupedContentInstance) {\n groupedContentInstance.instance.unload();\n });\n }\n }]);\n return GroupedContent;\n}();\n\nmodule.exports = GroupedContent;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZ3JvdXBlZC1jb250ZW50L2Rpc3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL2dyb3VwZWQtY29udGVudC9kaXN0L2luZGV4LmpzP2NkNTYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBmb3JFYWNoIG1ldGhvZCwgY291bGQgYmUgc2hpcHBlZCBhcyBwYXJ0IG9mIGFuIE9iamVjdCBMaXRlcmFsL01vZHVsZVxuZnVuY3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIHNjb3BlKSB7XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY2FsbGJhY2suY2FsbChzY29wZSwgYXJyYXlbaW5kZXhdLCBpbmRleCk7IC8vIHBhc3NlcyBiYWNrIHN0dWZmIHdlIG5lZWRcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgY2xhc3NOYW1lICsgJ3wgKycgKyBjbGFzc05hbWUsICdnJyk7XG5cbiAgcmV0dXJuIGVsLmNsYXNzTmFtZS5tYXRjaChyZWdleCk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXNzKGVsLCBjbGFzc05hbWUpIHtcbiAgLy8gUmV0dXJuIGlmIGl0IGFscmVhZHkgaGFzIHRoZSBjbGFzc05hbWVcbiAgaWYgKGhhc0NsYXNzKGVsLCBjbGFzc05hbWUpKSByZXR1cm47XG5cbiAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAvLyBSZXR1cm4gaWYgaXQgZG9lc24ndCBhbHJlYWR5IGhhdmUgdGhlIGNsYXNzTmFtZVxuICBpZiAoIWhhc0NsYXNzKGVsLCBjbGFzc05hbWUpKSByZXR1cm47XG5cbiAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBjbGFzc05hbWUgKyAnfCArJyArIGNsYXNzTmFtZSwgJ2cnKTtcblxuICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUucmVwbGFjZShyZWdleCwgJycpO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gIGlmIChoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSkge1xuICAgIHJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGFkZENsYXNzKGVsLCBjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWlyaW5nRnJvbVBhaXJpbmdUcmlnZ2VyKHBhaXJpbmdzLCBwYWlyaW5nVHJpZ2dlcikge1xuICB2YXIgZm91bmRQYWlyaW5nID0gbnVsbDtcblxuICBmb3JFYWNoKHBhaXJpbmdzLCBmdW5jdGlvbiAocGFpcmluZykge1xuICAgIGlmIChwYWlyaW5nLnRyaWdnZXIgPT09IHBhaXJpbmdUcmlnZ2VyKSB7XG4gICAgICBmb3VuZFBhaXJpbmcgPSBwYWlyaW5nO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZvdW5kUGFpcmluZztcbn1cblxuLyoqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcmV2aXNpb25zLzIxMTc1MjMvMTEgU3RhY2sgT3ZlcmZsb3d9XG4gKiBBbiBSRkM0MTIyIHY0IGNvbXBsaWFudCB1dWlkIHNvbHV0aW9uXG4gKi9cbmZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gICAgdmFyIHYgPSBjID09PSAneCcgPyByIDogciAmIDB4MyB8IDB4ODtcblxuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluaXQoZ3JvdXBlZENvbnRlbnQpIHtcbiAgdmFyIHRyaWdnZXJzID0gZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnM7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIHRyaWdnZXJzLnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJsaXN0Jyk7XG5cbiAgZm9yRWFjaChwYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcsIGluZGV4KSB7XG4gICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWInKTtcbiAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgZ3JvdXBlZENvbnRlbnQubmFtZXNwYWNlICsgJy0nICsgZ3JvdXBlZENvbnRlbnQuaWQgKyAnLScgKyBpbmRleCArICctY29udGVudCcpO1xuXG4gICAgdmFyIHRyaWdnZXJDb250ZW50ID0gcGFpcmluZy50cmlnZ2VyLmlubmVySFRNTDtcbiAgICB2YXIgdHJpZ2dlcldyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdHJpZ2dlcldyYXBwZXIuaW5uZXJIVE1MID0gdHJpZ2dlckNvbnRlbnQ7XG5cbiAgICBwYWlyaW5nLnRyaWdnZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgcGFpcmluZy50cmlnZ2VyLmFwcGVuZENoaWxkKHRyaWdnZXJXcmFwcGVyKTtcblxuICAgIGlmIChwYWlyaW5nLnRyaWdnZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yRWFjaChwYWlyaW5nLnRyaWdnZXIuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGFzQ2xhc3MocGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJykpIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xuICAgIH1cblxuICAgIHBhaXJpbmcuY29udGVudC5pZCA9IGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnO1xuICAgIHBhaXJpbmcuY29udGVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFicGFuZWwnKTtcblxuICAgIGlmICghaGFzQ2xhc3MocGFpcmluZy5jb250ZW50LCAnYWN0aXZlJykpIHtcbiAgICAgIHBhaXJpbmcuY29udGVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUoZ3JvdXBlZENvbnRlbnQpIHtcbiAgdmFyIHBhaXJpbmdzID0gZ3JvdXBlZENvbnRlbnQucGFpcmluZ3M7XG5cbiAgZm9yRWFjaChwYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICBwYWlyaW5nLnRyaWdnZXIucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJyk7XG4gICAgcGFpcmluZy5jb250ZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgIGlmIChoYXNDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICcwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy5jb250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH1cbiAgfSk7XG59XG5cbnZhciBhMTF5ID0ge1xuICBpbml0OiBpbml0LFxuICB1cGRhdGU6IHVwZGF0ZVxufTtcblxudmFyIGFzeW5jR2VuZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBd2FpdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNHZW5lcmF0b3IoZ2VuKSB7XG4gICAgdmFyIGZyb250LCBiYWNrO1xuXG4gICAgZnVuY3Rpb24gc2VuZChrZXksIGFyZykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgYXJnOiBhcmcsXG4gICAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGJhY2spIHtcbiAgICAgICAgICBiYWNrID0gYmFjay5uZXh0ID0gcmVxdWVzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcm9udCA9IGJhY2sgPSByZXF1ZXN0O1xuICAgICAgICAgIHJlc3VtZShrZXksIGFyZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc3VtZShrZXksIGFyZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBd2FpdFZhbHVlKSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlLnZhbHVlKS50aGVuKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJlc3VtZShcIm5leHRcIiwgYXJnKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXN1bWUoXCJ0aHJvd1wiLCBhcmcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldHRsZShyZXN1bHQuZG9uZSA/IFwicmV0dXJuXCIgOiBcIm5vcm1hbFwiLCByZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0dGxlKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR0bGUodHlwZSwgdmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwicmV0dXJuXCI6XG4gICAgICAgICAgZnJvbnQucmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInRocm93XCI6XG4gICAgICAgICAgZnJvbnQucmVqZWN0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGZyb250LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZnJvbnQgPSBmcm9udC5uZXh0O1xuXG4gICAgICBpZiAoZnJvbnQpIHtcbiAgICAgICAgcmVzdW1lKGZyb250LmtleSwgZnJvbnQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2ludm9rZSA9IHNlbmQ7XG5cbiAgICBpZiAodHlwZW9mIGdlbi5yZXR1cm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5yZXR1cm4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvcikge1xuICAgIEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG5cbiAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcIm5leHRcIiwgYXJnKTtcbiAgfTtcblxuICBBc3luY0dlbmVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcInRocm93XCIsIGFyZyk7XG4gIH07XG5cbiAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFwicmV0dXJuXCIsIGFyZyk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB3cmFwOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXN5bmNHZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgYXdhaXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5ldyBBd2FpdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuLyoqIEEgY2xhc3MgZm9yIGNyZWF0aW5nLCBtYW5hZ2luZywgYW5kIGRlc3Ryb3lpbmcgZ3JvdXBhYmxlIGNvbnRlbnQgYXMgdGFicy4gKi9cblxudmFyIFRhYnNMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRhYnNMYXlvdXQoZ3JvdXBlZENvbnRlbnQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUYWJzTGF5b3V0KTtcblxuICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQgPSBncm91cGVkQ29udGVudDtcbiAgICB0aGlzLnBhaXJpbmdzID0gZ3JvdXBlZENvbnRlbnQucGFpcmluZ3M7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuX2hhbmRsZUtleWRvd24gPSB0aGlzLl9oYW5kbGVLZXlkb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5faGFuZGxlQ2xpY2sgPSB0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIGExMXkuaW5pdCh0aGlzLmdyb3VwZWRDb250ZW50KTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFRhYnNMYXlvdXQsIFt7XG4gICAga2V5OiAndW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBldmVudC5mbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGV4aXN0aW5nQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGZvckVhY2godGhpcy5wYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICAgICAgdmFyIHRyaWdnZXIgPSBwYWlyaW5nLnRyaWdnZXI7XG5cbiAgICAgICAgaWYgKGhhc0NsYXNzKHRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgICAgIGV4aXN0aW5nQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF90aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICAgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIF90aGlzLl9oYW5kbGVDbGljayk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgdHlwZTogJ2tleWRvd24nLFxuICAgICAgICAgIGZuOiBfdGhpcy5faGFuZGxlS2V5ZG93blxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgIGZuOiBfdGhpcy5faGFuZGxlQ2xpY2tcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFleGlzdGluZ0FjdGl2ZSkge1xuICAgICAgICBhZGRDbGFzcyh0aGlzLnBhaXJpbmdzWzBdLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgICAgYWRkQ2xhc3ModGhpcy5wYWlyaW5nc1swXS5jb250ZW50LCAnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUtleWRvd24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgdmFyIHBhaXJpbmcgPSBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcih0aGlzLnBhaXJpbmdzLCB0cmlnZ2VyKTtcbiAgICAgIHZhciBwYWlyaW5nSW5kZXggPSB0aGlzLnBhaXJpbmdzLmluZGV4T2YocGFpcmluZyk7XG4gICAgICB2YXIgcHJldkluZGV4ID0gcGFpcmluZ0luZGV4IC0gMSA8IDAgPyB0aGlzLnBhaXJpbmdzLmxlbmd0aCAtIDEgOiBwYWlyaW5nSW5kZXggLSAxO1xuICAgICAgdmFyIG5leHRJbmRleCA9IHBhaXJpbmdJbmRleCArIDEgPj0gdGhpcy5wYWlyaW5ncy5sZW5ndGggPyAwIDogcGFpcmluZ0luZGV4ICsgMTtcblxuICAgICAgdmFyIG5leHRQYWlyaW5nID0gbnVsbDtcblxuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICBuZXh0UGFpcmluZyA9IHRoaXMucGFpcmluZ3NbcHJldkluZGV4XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgbmV4dFBhaXJpbmcgPSB0aGlzLnBhaXJpbmdzW25leHRJbmRleF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbmV4dFBhaXJpbmcgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBGYXN0IGV4aXQgaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFiIG9yIHRhYnNcbiAgICAgIGlmIChuZXh0UGFpcmluZyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBmb3JFYWNoKHRoaXMucGFpcmluZ3MsIGZ1bmN0aW9uIChpbmFjdGl2ZVBhaXJpbmcpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoaW5hY3RpdmVQYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoaW5hY3RpdmVQYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBhZGRDbGFzcyhuZXh0UGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJyk7XG4gICAgICBhZGRDbGFzcyhuZXh0UGFpcmluZy5jb250ZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgIG5leHRQYWlyaW5nLnRyaWdnZXIuZm9jdXMoKTtcblxuICAgICAgYTExeS51cGRhdGUodGhpcy5ncm91cGVkQ29udGVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUNsaWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2hhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgcGFpcmluZyA9IGZpbmRQYWlyaW5nRnJvbVBhaXJpbmdUcmlnZ2VyKHRoaXMucGFpcmluZ3MsIHRyaWdnZXIpO1xuXG4gICAgICAvLyBGYXN0IGV4aXQgaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFiIG9yIHRhYnNcbiAgICAgIGlmIChwYWlyaW5nID09PSBudWxsKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGZvckVhY2godGhpcy5wYWlyaW5ncywgZnVuY3Rpb24gKGluYWN0aXZlUGFpcmluZykge1xuICAgICAgICByZW1vdmVDbGFzcyhpbmFjdGl2ZVBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpO1xuICAgICAgICByZW1vdmVDbGFzcyhpbmFjdGl2ZVBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGFkZENsYXNzKHBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpO1xuICAgICAgYWRkQ2xhc3MocGFpcmluZy5jb250ZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgIGExMXkudXBkYXRlKHRoaXMuZ3JvdXBlZENvbnRlbnQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGFic0xheW91dDtcbn0oKTtcblxuZnVuY3Rpb24gaW5pdCQxKGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nLCBpbmRleCkge1xuICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsIGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnKTtcbiAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICcwJyk7XG5cbiAgICBpZiAocGFpcmluZy50cmlnZ2VyLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvckVhY2gocGFpcmluZy50cmlnZ2VyLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0NsYXNzKHBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpKSB7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgIH1cblxuICAgIHBhaXJpbmcuY29udGVudC5pZCA9IGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnO1xuXG4gICAgaWYgKCFoYXNDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy5jb250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSQxKGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nKSB7XG4gICAgcGFpcmluZy5jb250ZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgIGlmIChoYXNDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NsYXNzKHBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpKSB7XG4gICAgICBwYWlyaW5nLmNvbnRlbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgfVxuICB9KTtcbn1cblxudmFyIGExMXkkMSA9IHtcbiAgaW5pdDogaW5pdCQxLFxuICB1cGRhdGU6IHVwZGF0ZSQxXG59O1xuXG4vKiogQSBjbGFzcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgZGVzdHJveWluZyBncm91cGFibGUgY29udGVudCBhcyBhbiBhY2NvcmRpb24uICovXG5cbnZhciBBY2NvcmRpb25MYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFjY29yZGlvbkxheW91dChncm91cGVkQ29udGVudCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFjY29yZGlvbkxheW91dCk7XG5cbiAgICB0aGlzLmdyb3VwZWRDb250ZW50ID0gZ3JvdXBlZENvbnRlbnQ7XG4gICAgdGhpcy5wYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG5cbiAgICB0aGlzLl9oYW5kbGVLZXlkb3duID0gdGhpcy5faGFuZGxlS2V5ZG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2hhbmRsZUNsaWNrID0gdGhpcy5faGFuZGxlQ2xpY2suYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2luaXQodGhpcy5wYWlyaW5ncyk7XG4gICAgYTExeSQxLmluaXQodGhpcy5ncm91cGVkQ29udGVudCk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhBY2NvcmRpb25MYXlvdXQsIFt7XG4gICAga2V5OiAndW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBldmVudC5mbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgZm9yRWFjaCh0aGlzLnBhaXJpbmdzLCBmdW5jdGlvbiAocGFpcmluZykge1xuICAgICAgICB2YXIgdHJpZ2dlciA9IHBhaXJpbmcudHJpZ2dlcjtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBwYWlyaW5nLmNvbnRlbnQ7XG5cbiAgICAgICAgdHJpZ2dlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250ZW50LCB0cmlnZ2VyLm5leHRTaWJsaW5nKTtcblxuICAgICAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBfdGhpcy5faGFuZGxlQ2xpY2spO1xuXG4gICAgICAgIF90aGlzLmV2ZW50cy5wdXNoKHtcbiAgICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICAgIHR5cGU6ICdrZXlkb3duJyxcbiAgICAgICAgICBmbjogX3RoaXMuX2hhbmRsZUtleWRvd25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgICBmbjogX3RoaXMuX2hhbmRsZUNsaWNrXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQuY29udGVudHMucmVtb3ZlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUtleWRvd24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgdmFyIHBhaXJpbmcgPSBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcih0aGlzLnBhaXJpbmdzLCB0cmlnZ2VyKTtcblxuICAgICAgLy8gRmFzdCBleGl0IGlmIGVudGVyIGlzbid0IHByZXNzZWQgb3Igd2UgY2FuJ3QgZmluZCB0aGUgZ3JvdXBcbiAgICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicgfHwgcGFpcmluZyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB0b2dnbGVDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgIHRvZ2dsZUNsYXNzKHBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpO1xuICAgICAgYTExeSQxLnVwZGF0ZSh0aGlzLmdyb3VwZWRDb250ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaGFuZGxlQ2xpY2snLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBwYWlyaW5nID0gZmluZFBhaXJpbmdGcm9tUGFpcmluZ1RyaWdnZXIodGhpcy5wYWlyaW5ncywgdHJpZ2dlcik7XG5cbiAgICAgIC8vIEZhc3QgZXhpdCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBncm91cFxuICAgICAgaWYgKHBhaXJpbmcgPT09IG51bGwpIHJldHVybjtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdG9nZ2xlQ2xhc3MocGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJyk7XG4gICAgICB0b2dnbGVDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKTtcbiAgICAgIGExMXkkMS51cGRhdGUodGhpcy5ncm91cGVkQ29udGVudCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBY2NvcmRpb25MYXlvdXQ7XG59KCk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBub2RlcyByZWxhdGVkIHRvIHRoZSBoZWFkaW5nIG5vZGUuXG4gKiBAcGFyYW0ge25vZGV9IGhlYWRpbmcgLSBUaGUgaGVhZGluZyBub2RlIHRvIHNlYXJjaCBmb3IgY29udGVudCBmcm9tLlxuICogQHJldHVybnMge25vZGVbXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGluZ0NvbnRlbnQoaGVhZGluZykge1xuICB2YXIgaGVhZGluZ1RhZ05hbWVzID0gWydIMScsICdIMicsICdIMycsICdINCcsICdINScsICdINiddO1xuICB2YXIgdGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoaGVhZGluZy50YWdOYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBbXTtcblxuICB2YXIgc2libGluZyA9IGhlYWRpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gIHdoaWxlIChzaWJsaW5nICE9PSBudWxsICYmIChoZWFkaW5nVGFnTmFtZXMuaW5kZXhPZihzaWJsaW5nLnRhZ05hbWUpID09PSAtMSB8fCBoZWFkaW5nVGFnTmFtZXMuaW5kZXhPZihzaWJsaW5nLnRhZ05hbWUpID4gdGFnTmFtZUluZGV4KSkge1xuICAgIGNvbnRlbnQucHVzaChzaWJsaW5nKTtcblxuICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZztcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IGFycmF5IHJlcHJlc2VudGluZyB0aGUgaGVhZGluZyB0cmVlIGZyb20gYSBnaXZlbiBub2RlLlxuICogUm9vdCBub2RlcyBhcmUgZXZhbHVhdGVkIGRpZmZlcmVudGx5LCBhbmQgcmVxdWlyZXMgdGhlIGV2YWx1YXRpbmdSb290IGZsYWdcbiAqIHRvIGJlIHRydWUuXG4gKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIG5vZGUgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHtub2RlW119IGNoaWxkcmVuIC0gVGhlIGNoaWxkcmVuIG9mIHRoZSBldmFsdWF0ZWQgbm9kZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V2YWx1YXRpbmdSb290XSAtIFdoZXRoZXIgdG8gZXZhbHVhdGUgYXMgcm9vdCBub2RlLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBnZXRIZWFkaW5nVHJlZShlbCwgY2hpbGRyZW4pIHtcbiAgdmFyIGV2YWx1YXRpbmdSb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaGVhZGluZ1RhZ05hbWVzID0gWydIMScsICdIMicsICdIMycsICdINCcsICdINScsICdINiddO1xuICB2YXIgdGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoZWwudGFnTmFtZSk7XG4gIHZhciBoZWFkaW5ncyA9IFtdO1xuXG4gIHZhciBjdXJyZW50TG93ZXN0VGFnTmFtZUluZGV4ID0gNTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgdmFyIGNoaWxkVGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoY2hpbGQudGFnTmFtZSk7XG5cbiAgICBpZiAoY2hpbGRUYWdOYW1lSW5kZXggIT09IC0xICYmIGNoaWxkVGFnTmFtZUluZGV4IDwgY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCkge1xuICAgICAgY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCA9IGNoaWxkVGFnTmFtZUluZGV4O1xuICAgIH1cblxuICAgIGlmIChldmFsdWF0aW5nUm9vdCAmJiBjaGlsZFRhZ05hbWVJbmRleCAhPT0gLTEgJiYgY2hpbGRUYWdOYW1lSW5kZXggPD0gY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCB8fCAhZXZhbHVhdGluZ1Jvb3QgJiYgY2hpbGRUYWdOYW1lSW5kZXggIT09IC0xICYmIGNoaWxkVGFnTmFtZUluZGV4ID09PSB0YWdOYW1lSW5kZXggKyAxKSB7XG4gICAgICB2YXIgc2libGluZ3MgPSBnZXRIZWFkaW5nQ29udGVudChjaGlsZCk7XG5cbiAgICAgIHZhciBjaGlsZE5vZGUgPSB7XG4gICAgICAgIGVsOiBjaGlsZCxcbiAgICAgICAgY29udGVudDogc2libGluZ3MsXG4gICAgICAgIGNoaWxkcmVuOiBnZXRIZWFkaW5nVHJlZShjaGlsZCwgc2libGluZ3MpXG4gICAgICB9O1xuXG4gICAgICBoZWFkaW5ncy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhlYWRpbmdzO1xufVxuXG4vKipcbiAqIFJldHVybnMgZ3JvdXBpbmdzIG9mIGhlYWRpbmdzIHRoYXQgbWVldCB0aGUgbWluaW11bSBzZXF1ZW5jZSB2YWx1ZVxuICogYW5kIGRvbid0IGNvbnRhaW4gYW55IGludmFsaWQgaGVhZGluZ3MuXG4gKiBAcGFyYW0ge09iamVjdFtdfSBoZWFkaW5ncyAtIEFuIGFycmF5IG9mIGhlYWRpbmcgb2JqZWN0cy5cbiAqIEBwYXJhbSB7aW50W119IGludmFsaWRIZWFkaW5ncyAtIEFuIGFycmF5IG9mIGludmFsaWQgaGVhZGluZyBpbnRlZ2VycyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyBpbmRleGVzIG9mIGhlYWRpbmdzLlxuICogQHBhcmFtIHsqfSBtaW5JblNlcXVlbmNlIC0gTWluaW11bSBoZWFkaW5ncyBpbiBzZXF1ZW5jZSBiZWZvcmUgYmVpbmcgY29uc2lkZXJlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBncm91cGluZy5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG5mdW5jdGlvbiBnZXRIZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZShoZWFkaW5ncywgaW52YWxpZEhlYWRpbmdzLCBtaW5JblNlcXVlbmNlKSB7XG4gIHZhciBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZSA9IFtdO1xuICB2YXIgY3VycmVudEhlYWRpbmdHcm91cEluU2VxdWVuY2UgPSBbXTtcbiAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkaW5ncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpbnZhbGlkSGVhZGluZ3MuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlLnB1c2goaGVhZGluZ3NbaV0pO1xuICAgICAgY3VycmVudFNlcXVlbmNlICs9IDE7XG5cbiAgICAgIGlmIChpICE9PSBoZWFkaW5ncy5sZW5ndGggLSAxICYmIGhlYWRpbmdzW2ldLmVsLnRhZ05hbWUgIT09IGhlYWRpbmdzW2kgKyAxXS5lbC50YWdOYW1lICYmIGludmFsaWRIZWFkaW5ncy5pbmRleE9mKGkgKyAxKSkge1xuICAgICAgICBjdXJyZW50SGVhZGluZ0dyb3VwSW5TZXF1ZW5jZSA9IFtdO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2UgPSAwO1xuICAgICAgfSBlbHNlIGlmIChpICE9PSAwICYmIGhlYWRpbmdzW2ldLmVsLnRhZ05hbWUgIT09IGhlYWRpbmdzW2kgLSAxXS5lbC50YWdOYW1lKSB7XG4gICAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlLnBvcCgpO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2UgLT0gMTtcblxuICAgICAgICBpZiAoY3VycmVudFNlcXVlbmNlID49IG1pbkluU2VxdWVuY2UpIHtcbiAgICAgICAgICBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZS5wdXNoKGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlID0gW2hlYWRpbmdzW2ldXTtcbiAgICAgICAgY3VycmVudFNlcXVlbmNlID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudFNlcXVlbmNlID49IG1pbkluU2VxdWVuY2UpIHtcbiAgICBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZS5wdXNoKGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgbmVjZXNzYXJ5IERPTSBlbGVtZW50cyB0byBncm91cCByZWxhdGVkIGNvbnRlbnQuXG4gKiBSZXR1cm5zIGEgb2JqZWN0IGFycmF5IHJlcHJlc2VudGluZyB0aGUgZ3JvdXBlZCBjb250ZW50LlxuICogQHBhcmFtIHtPYmplY3RbXX0gY2hpbGRyZW4gLSBBbiBhcnJheSBvZiBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBjcmVhdGVHcm91cGVkQ29udGVudChjaGlsZHJlbikge1xuICB2YXIgcGFpcmluZ3MgPSBbXTtcblxuICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdLmVsO1xuICB2YXIgdHJpZ2dlcnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIGNvbnRlbnRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgY29udGVudHMgPSBmaXJzdENoaWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRlbnRzLCBmaXJzdENoaWxkLm5leHRTaWJsaW5nKTtcbiAgdHJpZ2dlcnMgPSBmaXJzdENoaWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaWdnZXJzLCBmaXJzdENoaWxkLm5leHRTaWJsaW5nKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgdmFyIHRyaWdnZXIgPSBjaGlsZC5lbDtcbiAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgdHJpZ2dlciA9IHRyaWdnZXJzLmFwcGVuZENoaWxkKHRyaWdnZXIpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50cy5hcHBlbmRDaGlsZChjb250ZW50KTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQuY29udGVudC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgY29udGVudC5hcHBlbmRDaGlsZChjaGlsZC5jb250ZW50W2pdKTtcbiAgICB9XG5cbiAgICBwYWlyaW5ncy5wdXNoKHtcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICBjb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRyaWdnZXJzOiB0cmlnZ2VycyxcbiAgICBjb250ZW50czogY29udGVudHMsXG4gICAgcGFpcmluZ3M6IHBhaXJpbmdzXG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ3JvdXBhYmxlIGNvbnRlbnQgd2l0aGluIHRoZSBzdXBwbGllZCBub2RlLlxuICogQHBhcmFtIHtub2RlfSBub2RlIC0gQSBub2RlIHRvIHRyYXZlcnNlIGZvciBncm91cGFibGUgY29udGVudC5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG4vKlxuICogUmVjdXJzaXZlIGZ1bmN0aW9uOlxuICogIFJldHVybnMgYWxsIGdyb3VwcyBvZiBoZWFkaW5ncyB0aGF0XG4gKiAgYXJlIGVsZWdpYmxlIHRvIGJlY29tZSBncm91cGVkIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwZWRDb250ZW50U2V0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgdmFyIGNoaWxkcmVuV2l0aEdyb3VwYWJsZUNvbnRlbnQgPSBbXTtcbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gW107XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgY2hpbGRHcm91cGFibGVDb250ZW50ID0gZ2V0R3JvdXBlZENvbnRlbnRTZXQoY2hpbGRyZW5baV0pO1xuXG4gICAgaWYgKGNoaWxkR3JvdXBhYmxlQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGlsZHJlbldpdGhHcm91cGFibGVDb250ZW50LnB1c2goaSk7XG4gICAgICBncm91cGVkQ29udGVudFNldCA9IGdyb3VwZWRDb250ZW50U2V0LmNvbmNhdChjaGlsZEdyb3VwYWJsZUNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZSA9IGdldEhlYWRpbmdHcm91cHNJblNlcXVlbmNlKGNoaWxkcmVuLCBjaGlsZHJlbldpdGhHcm91cGFibGVDb250ZW50LCAzKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaGVhZGluZ0dyb3Vwc0luU2VxdWVuY2UubGVuZ3RoOyBfaSArPSAxKSB7XG4gICAgZ3JvdXBlZENvbnRlbnRTZXQucHVzaChjcmVhdGVHcm91cGVkQ29udGVudChoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZVtfaV0pKTtcbiAgfVxuXG4gIHJldHVybiBncm91cGVkQ29udGVudFNldDtcbn1cblxuLyoqXG4gKiBXaGVuIHN0YXRpYyBwYXJzaW5nIGlzbid0IGVub3VnaCwgdGhlcmUncyBpbnRlbGxpcGFyc2XihKIhXG4gKiBTZWFyY2hlcyB0aHJvdWdoIGRvbSBjb250ZW50IHRvIGZpbmQgaGVhZGluZyBncm91cGluZ3MgdGhhdFxuICogYXJlIGVsZWdpYmxlIHRvIGJlY29tZSB0YWIgZ3JvdXBzLlxuICogQXNzdW1lcyB0aGF0IGNvbnRlbnQgaXMgaW4gYSBmbGF0dGVuZWQgaGllcmFyY2h5IGluIHRoZSBkb21cbiAqIGFuZCBpbnRlcnByZXRzIGluY3JlYXNpbmcgaGVhZGluZyB2YWx1ZXMgYXMgYSBkZWVwZXIgbGV2ZWwgb2YgbmVzdGluZy5cbiAqIFJldHVybnMgYWxsIGdyb3VwYWJsZSBjb250ZW50IGFzIGFuIGFycmF5IG9mIG9iamVjdCBhcnJheXMuXG4gKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIG5vZGUgd2hvJ3MgY29udGVudCB3aWxsIGJlIHNlYXJjaGVkIGZvciBncm91cGFibGUgY29udGVudC5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG5mdW5jdGlvbiBpbnRlbGxpUGFyc2UoZWwpIHtcbiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG4gIHZhciBoZWFkaW5nID0gZWwucXVlcnlTZWxlY3RvcignaDEsIGgyLCBoMywgaDQsIGg1LCBoNicpO1xuXG4gIC8vIEZhc3QgcmV0dXJuIGlmIHRoZXJlJ3Mgbm8gaGVhZGluZ3NcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIHZhciByb290Tm9kZSA9IHtcbiAgICBlbDogZWwsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBjaGlsZHJlbjogZ2V0SGVhZGluZ1RyZWUoaGVhZGluZywgY2hpbGRyZW4sIHRydWUpXG4gIH07XG5cbiAgcmV0dXJuIGdldEdyb3VwZWRDb250ZW50U2V0KHJvb3ROb2RlKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgY29udGVudCBmcm9tIGEgZ2l2ZW4gbm9kZSBiYXNlZCBvbiBhIHN0YXRpYyBzdHJ1Y3R1cmUuXG4gKiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6XG4gKiA8dWwgY2xhc3M9XCJ0YWJzXCI+XG4gKiAgIDxsaSBjbGFzcz1cImFjdGl2ZVwiPlRhYiAxPC9saT5cbiAqICAgPGxpPlRhYiAyPC9saT5cbiAqICAgPGxpPlRhYiAzPC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHVsIGNsYXNzPVwidGFicy1jb250ZW50XCI+XG4gKiAgIDxsaSBjbGFzcz1cImFjdGl2ZVwiPlxuICogICAgIDxwPlRhYiAxIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxwPlRhYiAyIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxwPlRhYiAzIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqIDwvdWw+XG4gKiBSZXR1cm5zIGFsbCBncm91cGFibGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBvYmplY3QgYXJyYXlzLlxuICogQHBhcmFtIHtub2RlfSBlbCAtIFRoZSBub2RlIHdobydzIGNvbnRlbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgZ3JvdXBhYmxlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0W11bXX1cbiAqL1xuZnVuY3Rpb24gc3RhdGljUGFyc2UoZWwpIHtcbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gW107XG5cbiAgdmFyIHRhYnMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcudGFicycpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciB0cmlnZ2VycyA9IHRhYnNbaV0uY2hpbGRyZW47XG4gICAgdmFyIGNvbnRlbnRzID0gdGFic1tpXS5uZXh0RWxlbWVudFNpYmxpbmcuY2hpbGRyZW47XG5cbiAgICAvLyBPbmx5IGFkZCBhIHRhYiBncm91cCBpZiBlcXVhbCB0cmlnZ2VycyB0byBjb250ZW50c1xuICAgIGlmICh0cmlnZ2Vycy5sZW5ndGggPT09IGNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGdyb3VwZWRDb250ZW50U2V0LnB1c2goe1xuICAgICAgICB0cmlnZ2VyczogdGFic1tpXSxcbiAgICAgICAgY29udGVudHM6IHRhYnNbaV0ubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICBwYWlyaW5nczogW11cbiAgICAgIH0pO1xuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmlnZ2Vycy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgdHJpZ2dlciA9IHRyaWdnZXJzW2pdO1xuICAgICAgICB2YXIgY29udGVudCA9IGNvbnRlbnRzW2pdO1xuXG4gICAgICAgIHZhciBwYWlyaW5nID0ge1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGdyb3VwZWRDb250ZW50U2V0W2luZGV4XS5wYWlyaW5ncy5wdXNoKHBhaXJpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cGVkQ29udGVudFNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBncm91cGFibGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBvYmplY3QgYXJyYXlzLlxuICogQHBhcmFtIHtub2RlfSBjb250ZW50IC0gVGhlIG5vZGUgdG8gcGFyc2UgZm9yIGdyb3VwYWJsZSBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBpbnRlbGxpcGFyc2UgLSBXaGV0aGVyIHRvIHVzZSBpbnRlbGxpZ2VudCBwYXJzaW5nLlxuICogQHJldHVybnMge09iamVjdFtdW119XG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGNvbnRlbnQpIHtcbiAgdmFyIGludGVsbGlwYXJzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gaW50ZWxsaXBhcnNlID8gaW50ZWxsaVBhcnNlKGNvbnRlbnQpIDogc3RhdGljUGFyc2UoY29udGVudCk7XG5cbiAgcmV0dXJuIGdyb3VwZWRDb250ZW50U2V0O1xufVxuXG4vKiogQSBjbGFzcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgZGVzdHJveWluZyBncm91cGFibGUgY29udGVudC4gKi9cblxudmFyIEdyb3VwZWRDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlIGdyb3VwZWQgY29udGVudFxuICAgKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIGVsZW1lbnQgdG8gc2VhcmNoIGZvciBncm91cGFibGUgY29udGVudCBpbi5cbiAgICogQHBhcmFtIHtPYmplY3R9ICBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9ICBbb3B0aW9ucy5sYXlvdXRdIC0gVGhlIGxheW91dCB0byBkaXNwbGF5IGdyb3VwYWJsZSBjb250ZW50IGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmludGVsbGlwYXJzZV0gLSBUaGUgcGFyc2luZyBhbGdvcml0aG0gdXNlZCB0byBmaW5kIGNvbnRlbnQgd2l0aC5cbiAgICovXG4gIGZ1bmN0aW9uIEdyb3VwZWRDb250ZW50KGVsKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHcm91cGVkQ29udGVudCk7XG5cbiAgICB0aGlzLm5hbWVzcGFjZSA9ICdncm91cGVkLWNvbnRlbnQnO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmdyb3VwZWRDb250ZW50SW5zdGFuY2VzID0gW107XG5cbiAgICB2YXIgbGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQgfHwgJ3RhYnMnO1xuICAgIHZhciBpbnRlbGxpcGFyc2UgPSAhIW9wdGlvbnMuaW50ZWxsaXBhcnNlO1xuXG4gICAgZm9yRWFjaChwYXJzZShlbCwgaW50ZWxsaXBhcnNlKSwgZnVuY3Rpb24gKGdyb3VwZWRDb250ZW50KSB7XG4gICAgICB2YXIgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG51bGw7XG4gICAgICB2YXIgZ3JvdXBlZENvbnRlbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGdyb3VwZWRDb250ZW50V3JhcHBlciA9IGdyb3VwZWRDb250ZW50LnRyaWdnZXJzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGdyb3VwZWRDb250ZW50V3JhcHBlciwgZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMubmV4dFNpYmxpbmcpO1xuXG4gICAgICBhZGRDbGFzcyhncm91cGVkQ29udGVudFdyYXBwZXIsIF90aGlzLm5hbWVzcGFjZSk7XG4gICAgICBhZGRDbGFzcyhncm91cGVkQ29udGVudFdyYXBwZXIsIF90aGlzLm5hbWVzcGFjZSArICctbGF5b3V0LScgKyBsYXlvdXQpO1xuXG4gICAgICBncm91cGVkQ29udGVudFdyYXBwZXIuYXBwZW5kQ2hpbGQoZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMpO1xuICAgICAgZ3JvdXBlZENvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGdyb3VwZWRDb250ZW50LmNvbnRlbnRzKTtcblxuICAgICAgZ3JvdXBlZENvbnRlbnQubmFtZXNwYWNlID0gX3RoaXMubmFtZXNwYWNlO1xuICAgICAgZ3JvdXBlZENvbnRlbnQuaWQgPSBpZDtcbiAgICAgIGdyb3VwZWRDb250ZW50LnRyaWdnZXJzLmlkID0gX3RoaXMubmFtZXNwYWNlICsgJy0nICsgaWQgKyAnLXRyaWdnZXJzJztcbiAgICAgIGdyb3VwZWRDb250ZW50LmNvbnRlbnRzLmlkID0gX3RoaXMubmFtZXNwYWNlICsgJy0nICsgaWQgKyAnLWNvbnRlbnRzJztcblxuICAgICAgYWRkQ2xhc3MoZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMsIF90aGlzLm5hbWVzcGFjZSArICctdHJpZ2dlcnMnKTtcbiAgICAgIGFkZENsYXNzKGdyb3VwZWRDb250ZW50LmNvbnRlbnRzLCBfdGhpcy5uYW1lc3BhY2UgKyAnLWNvbnRlbnRzJyk7XG5cbiAgICAgIGZvckVhY2goZ3JvdXBlZENvbnRlbnQucGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nKSB7XG4gICAgICAgIGFkZENsYXNzKHBhaXJpbmcudHJpZ2dlciwgX3RoaXMubmFtZXNwYWNlICsgJy10cmlnZ2VyJyk7XG4gICAgICAgIGFkZENsYXNzKHBhaXJpbmcuY29udGVudCwgX3RoaXMubmFtZXNwYWNlICsgJy1jb250ZW50Jyk7XG4gICAgICB9KTtcblxuICAgICAgc3dpdGNoIChsYXlvdXQpIHtcbiAgICAgICAgY2FzZSAnYWNjb3JkaW9uJzpcbiAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY2NvcmRpb25MYXlvdXQoZ3JvdXBlZENvbnRlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0YWJzJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUYWJzTGF5b3V0KGdyb3VwZWRDb250ZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZ3JvdXBlZENvbnRlbnRJbnN0YW5jZXMucHVzaCh7XG4gICAgICAgIGdyb3VwZWRDb250ZW50OiBncm91cGVkQ29udGVudCxcbiAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBVbmxvYWQgYWxsIGdyb3VwZWQgY29udGVudCBpbnN0YW5jZXMgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEdyb3VwZWRDb250ZW50LCBbe1xuICAgIGtleTogJ3VubG9hZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIGZvckVhY2godGhpcy5ncm91cGVkQ29udGVudEluc3RhbmNlcywgZnVuY3Rpb24gKGdyb3VwZWRDb250ZW50SW5zdGFuY2UpIHtcbiAgICAgICAgZ3JvdXBlZENvbnRlbnRJbnN0YW5jZS5pbnN0YW5jZS51bmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gR3JvdXBlZENvbnRlbnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JvdXBlZENvbnRlbnQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/grouped-content/dist/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js":
+/*!******************************************************************************!*\
+ !*** ./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js ***!
+ \******************************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\n/*!\n * @pixelunion/pxs-complementary-products v3.5.3\n * (c) 2022 Pixel Union\n */\n\n\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {};\n\nfunction unwrapExports (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar EventHandler_1 = createCommonjsModule(function (module, exports) {\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n function EventHandler() {\n this.events = [];\n }\n EventHandler.prototype.register = function (el, event, listener) {\n if (!el || !event || !listener)\n return null;\n this.events.push({ el: el, event: event, listener: listener });\n el.addEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregister = function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n if (!el || !event || !listener)\n return null;\n this.events = this.events.filter(function (e) { return el !== e.el\n || event !== e.event || listener !== e.listener; });\n el.removeEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregisterAll = function () {\n this.events.forEach(function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n return el.removeEventListener(event, listener);\n });\n this.events = [];\n };\n return EventHandler;\n}());\nexports[\"default\"] = EventHandler;\n});\n\nvar EventHandler = unwrapExports(EventHandler_1);\n\n/*!\n * @pixelunion/shopify-asyncview v2.0.5\n * (c) 2020 Pixel Union\n */\n\nfunction _classCallCheck$1(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties$1(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass$1(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties$1(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar deferred = {};\n\nvar AsyncView = /*#__PURE__*/function () {\n function AsyncView() {\n _classCallCheck$1(this, AsyncView);\n }\n\n _createClass$1(AsyncView, null, [{\n key: \"load\",\n\n /**\n * Load the template given by the provided URL into the provided\n * view\n *\n * @param {string} url - The url to load\n * @param {object} query - An object containing additional query parameters of the URL\n * @param {string} query.view - A required query parameter indicating which view to load\n * @param {object} [options] - Config options\n * @param {string} [options.hash] - A hash of the current page content\n */\n value: function load(url) {\n var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!('view' in query)) {\n return Promise.reject(new Error('\\'view\\' not found in \\'query\\' parameter'));\n }\n\n var querylessUrl = url.replace(/\\?[^#]+/, '');\n var queryParamsString = new RegExp(/.+\\?([^#]+)/).exec(url);\n var queryParams = query;\n\n if (queryParamsString && queryParamsString.length >= 2) {\n queryParamsString[1].split('&').forEach(function (param) {\n var _param$split = param.split('='),\n _param$split2 = _slicedToArray(_param$split, 2),\n key = _param$split2[0],\n value = _param$split2[1];\n\n queryParams[key] = value;\n });\n } // NOTE: We're adding an additional timestamp to the query.\n // This is to prevent certain browsers from returning cached\n // versions of the url we are requesting.\n // See this PR for more info: https://github.com/pixelunion/shopify-asyncview/pull/4\n\n\n var cachebustingParams = _objectSpread2({}, queryParams, {\n _: new Date().getTime()\n });\n\n var hashUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n return \"\".concat(address, \"?\").concat(Object.keys(queryParams).sort().map(function (key) {\n return \"\".concat(key, \"=\").concat(encodeURIComponent(queryParams[key]));\n }).join('&')).concat(hash);\n });\n var requestUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n return \"\".concat(address, \"?\").concat(Object.keys(cachebustingParams).sort().map(function (key) {\n return \"\".concat(key, \"=\").concat(encodeURIComponent(cachebustingParams[key]));\n }).join('&')).concat(hash);\n });\n var promise = new Promise(function (resolve, reject) {\n var data;\n\n if (hashUrl in deferred) {\n resolve(deferred[hashUrl]);\n return;\n }\n\n deferred[hashUrl] = promise;\n\n if (options.hash) {\n data = sessionStorage.getItem(hashUrl);\n\n if (data) {\n var deserialized = JSON.parse(data);\n\n if (options.hash === deserialized.options.hash) {\n delete deferred[hashUrl];\n resolve(deserialized);\n return;\n }\n }\n }\n\n var xhr = new XMLHttpRequest();\n xhr.open('GET', requestUrl, true);\n\n xhr.onload = function () {\n var el = xhr.response;\n var newOptions = {};\n var optionsEl = el.querySelector('[data-options]');\n\n if (optionsEl && optionsEl.innerHTML) {\n newOptions = JSON.parse(el.querySelector('[data-options]').innerHTML);\n }\n\n var htmlEls = el.querySelectorAll('[data-html]');\n var newHtml = {};\n\n if (htmlEls.length === 1 && htmlEls[0].getAttribute('data-html') === '') {\n newHtml = htmlEls[0].innerHTML;\n } else {\n for (var i = 0; i < htmlEls.length; i++) {\n newHtml[htmlEls[i].getAttribute('data-html')] = htmlEls[i].innerHTML;\n }\n }\n\n var dataEls = el.querySelectorAll('[data-data]');\n var newData = {};\n\n if (dataEls.length === 1 && dataEls[0].getAttribute('data-data') === '') {\n newData = JSON.parse(dataEls[0].innerHTML);\n } else {\n for (var _i = 0; _i < dataEls.length; _i++) {\n newData[dataEls[_i].getAttribute('data-data')] = JSON.parse(dataEls[_i].innerHTML);\n }\n }\n\n if (options.hash) {\n try {\n sessionStorage.setItem(hashUrl, JSON.stringify({\n options: newOptions,\n data: newData,\n html: newHtml\n }));\n } catch (error) {\n console.error(error);\n }\n }\n\n delete deferred[hashUrl];\n resolve({\n data: newData,\n html: newHtml\n });\n };\n\n xhr.onerror = function () {\n delete deferred[hashUrl];\n reject();\n };\n\n xhr.responseType = 'document';\n xhr.send();\n });\n return promise;\n }\n }]);\n\n return AsyncView;\n}();\n\nvar evEmitter = createCommonjsModule(function (module) {\n/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : commonjsGlobal, function() {\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i];\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n});\n\nvar getSize = createCommonjsModule(function (module) {\n/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n});\n\nvar matchesSelector = createCommonjsModule(function (module) {\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n});\n\nvar utils = createCommonjsModule(function (module) {\n/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n matchesSelector\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n});\n\nvar cell = createCommonjsModule(function (module) {\n// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n getSize\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory(\n window,\n window.getSize\n );\n }\n\n}( window, function factory( window, getSize ) {\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n this.element.style[ this.parent.originSide ] = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n this.element.style.transform = '';\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var sideOffset = this.parent.originSide === 'left' ? 1 : -1;\n\n var adjustedX = this.parent.options.percentPosition ?\n x * sideOffset * ( this.parent.size.innerWidth / this.size.width ) :\n x * sideOffset;\n\n this.element.style.transform = 'translateX(' +\n this.parent.getPositionValue( adjustedX ) + ')';\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} shift - 0, 1, or -1\n */\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n} ) );\n});\n\nvar slide = createCommonjsModule(function (module) {\n// slide\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( window, function factory() {\n\nfunction Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n } );\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n } );\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n } );\n};\n\nreturn Slide;\n\n} ) );\n});\n\nvar animate = createCommonjsModule(function (module) {\n// animate\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n utils\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory(\n window,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, utils ) {\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n } );\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x -= this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D transforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n var isResting = !this.isPointerDown &&\n Math.round( this.x * 100 ) == Math.round( previousX * 100 );\n if ( isResting ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i = 0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i = 0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n});\n\nvar flickity = createCommonjsModule(function (module) {\n// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n evEmitter,\n getSize,\n utils,\n cell,\n slide,\n animate\n );\n } else {\n // browser global\n var _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n if ( instance ) instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true,\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i = index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n } );\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match( /^(\\d+)%$/ );\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n /* eslint-disable-next-line no-invalid-this */\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5,\n },\n left: {\n left: 0,\n right: 1,\n },\n right: {\n right: 0,\n left: 1,\n },\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = new jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i = 0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i = 0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n } );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match( /^[#.]?[\\d/]/ ) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n // #1177 disable resize behavior when animating or dragging for iOS 15\n if ( !this.isActive || this.isAnimating || this.isDragging ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility || isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus ...\n // #Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n } );\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar unipointer = createCommonjsModule(function (module) {\n/*!\n * Unipointer v2.4.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n evEmitter\n );\n } else {\n // browser global\n window.Unipointer = factory(\n window,\n window.EvEmitter\n );\n }\n\n}( window, function factory( window, EvEmitter ) {\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( 'ontouchstart' in window ) {\n // HACK prefer Touch Events as you can preventDefault on touchstart to\n // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n startEvent = 'touchstart';\n } else if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n\n this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n\n delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n});\n\nvar unidragger = createCommonjsModule(function (module) {\n/*!\n * Unidragger v2.4.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n unipointer\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.Unipointer\n );\n }\n\n}( window, function factory( window, Unipointer ) {\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n});\n\nvar drag = createCommonjsModule(function (module) {\n// drag\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n flickity,\n unidragger,\n utils\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n} );\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nproto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x %= this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( dist, minDist ) {\n return dist <= minDist;\n } : function( dist, minDist ) {\n return dist < minDist;\n };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment,\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset,\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n});\n\nvar prevNextButton = createCommonjsModule(function (module) {\n// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n flickity,\n unipointer,\n utils\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n\n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n\n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg' );\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path' );\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n};\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30,\n },\n} );\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n\n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n\n this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar pageDots = createCommonjsModule(function (module) {\n// page dots\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n flickity,\n unipointer,\n utils\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n\n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n\n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true,\n} );\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar player = createCommonjsModule(function (module) {\n// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n evEmitter,\n utils,\n flickity\n );\n } else {\n // browser global\n factory(\n window.EvEmitter,\n window.fizzyUIUtils,\n window.Flickity\n );\n }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n\n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true,\n} );\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n this.player = new Player( this );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar addRemoveCell = createCommonjsModule(function (module) {\n// add, remove cell\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n flickity,\n utils\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n } );\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n * @param {Boolean} isPositioningSlider - Positions slider after selection\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n});\n\nvar lazyload = createCommonjsModule(function (module) {\n// lazyload\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n flickity,\n utils\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n } );\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Flickity} flickity - Flickity instance\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar js = createCommonjsModule(function (module) {\n/*!\n * Flickity v2.3.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2021 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( module.exports ) {\n // CommonJS\n module.exports = factory(\n flickity,\n drag,\n prevNextButton,\n pageDots,\n player,\n addRemoveCell,\n lazyload\n );\n }\n\n} )( window, function factory( Flickity ) {\n return Flickity;\n} );\n});\n\nvar ComplementaryProducts = /*#__PURE__*/function () {\n function ComplementaryProducts(options) {\n _classCallCheck(this, ComplementaryProducts);\n\n this.sectionEl = options.sectionEl;\n this.sectionId = options.sectionId;\n this.events = new EventHandler();\n this.productId = options.productId;\n this.includeIndicatorDots = options.includeIndicatorDots || false;\n this.recommendationsRoute = options.productRecommendationsRoute;\n this.limit = options.limit;\n var defaultArrowShape = {\n x0: 10,\n x1: 60,\n y1: 50,\n x2: 65,\n y2: 45,\n x3: 20\n };\n this.arrowShape = options.arrowShape || defaultArrowShape;\n this.recommendationsEl = this.sectionEl.querySelector('[data-complementary-products]');\n this.loadRecommendations();\n }\n\n _createClass(ComplementaryProducts, [{\n key: \"loadRecommendations\",\n value: function loadRecommendations() {\n var _this = this;\n\n var url = \"\".concat(this.recommendationsRoute, \"?section_id=\").concat(this.sectionId, \"&limit=\").concat(this.limit, \"&product_id=\").concat(this.productId, \"&intent=complementary\");\n AsyncView.load(url, {\n view: ''\n }).then(function (_ref) {\n var html = _ref.html;\n if (_typeof(html) === 'object' && Object.keys(html).length === 0) return;\n\n if (html.trim().length === 0) {\n _this.recommendationsEl.classList.add('complementary-products--no-recommendations');\n\n return;\n }\n\n _this.recommendationsEl.innerHTML = html;\n\n if (!_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.instance) {\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.init();\n }\n\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(_this.recommendationsEl);\n\n var slider = _this.recommendationsEl.querySelector('[data-slider]');\n\n var slides = _this.recommendationsEl.querySelectorAll('[data-slide]');\n\n if (slides.length > 1) {\n _this.slider = new js(slider, {\n cellSelector: '[data-slide]',\n accessibility: false,\n adaptiveHeight: false,\n autoPlay: false,\n cellAlign: 'left',\n contain: true,\n imagesLoaded: true,\n pageDots: _this.includeIndicatorDots,\n wrapAround: true,\n arrowShape: _this.arrowShape\n });\n\n _this.events.register(slider, 'rimg:load', function () {\n _this.slider.resize();\n });\n }\n });\n }\n }, {\n key: \"unload\",\n value: function unload() {\n this.slider.destroy();\n }\n }]);\n\n return ComplementaryProducts;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ComplementaryProducts);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLWNvbXBsZW1lbnRhcnktcHJvZHVjdHMvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLWNvbXBsZW1lbnRhcnktcHJvZHVjdHMvZGlzdC9pbmRleC5lcy5qcz8xNzE0Il0sInNvdXJjZXNDb250ZW50IjpbIlxuLyohXG4gKiBAcGl4ZWx1bmlvbi9weHMtY29tcGxlbWVudGFyeS1wcm9kdWN0cyB2My41LjNcbiAqIChjKSAyMDIyIFBpeGVsIFVuaW9uXG4gKi9cblxuaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbnZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5mdW5jdGlvbiB1bndyYXBFeHBvcnRzICh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG52YXIgRXZlbnRIYW5kbGVyXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEV2ZW50SGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZWwsIGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBlbCA9IF9hLmVsLCBldmVudCA9IF9hLmV2ZW50LCBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVsICE9PSBlLmVsXG4gICAgICAgICAgICB8fCBldmVudCAhPT0gZS5ldmVudCB8fCBsaXN0ZW5lciAhPT0gZS5saXN0ZW5lcjsgfSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIGVsID0gX2EuZWwsIGV2ZW50ID0gX2EuZXZlbnQsIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICAgICAgICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudEhhbmRsZXI7XG59KCkpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudEhhbmRsZXI7XG59KTtcblxudmFyIEV2ZW50SGFuZGxlciA9IHVud3JhcEV4cG9ydHMoRXZlbnRIYW5kbGVyXzEpO1xuXG4vKiFcbiAgICogQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcgdjIuMC41XG4gICAqIChjKSAyMDIwIFBpeGVsIFVuaW9uXG4gICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkMSh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDEoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obik7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgZGVmZXJyZWQgPSB7fTtcblxudmFyIEFzeW5jVmlldyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzeW5jVmlldygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBBc3luY1ZpZXcpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzJDEoQXN5bmNWaWV3LCBudWxsLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSB0ZW1wbGF0ZSBnaXZlbiBieSB0aGUgcHJvdmlkZWQgVVJMIGludG8gdGhlIHByb3ZpZGVkXG4gICAgICogdmlld1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSB1cmwgdG8gbG9hZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBxdWVyeSAtIEFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyBvZiB0aGUgVVJMXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5LnZpZXcgLSBBIHJlcXVpcmVkIHF1ZXJ5IHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoaWNoIHZpZXcgdG8gbG9hZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBDb25maWcgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5oYXNoXSAtIEEgaGFzaCBvZiB0aGUgY3VycmVudCBwYWdlIGNvbnRlbnRcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZCh1cmwpIHtcbiAgICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICAgIGlmICghKCd2aWV3JyBpbiBxdWVyeSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignXFwndmlld1xcJyBub3QgZm91bmQgaW4gXFwncXVlcnlcXCcgcGFyYW1ldGVyJykpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcXVlcnlsZXNzVXJsID0gdXJsLnJlcGxhY2UoL1xcP1teI10rLywgJycpO1xuICAgICAgdmFyIHF1ZXJ5UGFyYW1zU3RyaW5nID0gbmV3IFJlZ0V4cCgvLitcXD8oW14jXSspLykuZXhlYyh1cmwpO1xuICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gcXVlcnk7XG5cbiAgICAgIGlmIChxdWVyeVBhcmFtc1N0cmluZyAmJiBxdWVyeVBhcmFtc1N0cmluZy5sZW5ndGggPj0gMikge1xuICAgICAgICBxdWVyeVBhcmFtc1N0cmluZ1sxXS5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgdmFyIF9wYXJhbSRzcGxpdCA9IHBhcmFtLnNwbGl0KCc9JyksXG4gICAgICAgICAgICAgIF9wYXJhbSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfcGFyYW0kc3BsaXQsIDIpLFxuICAgICAgICAgICAgICBrZXkgPSBfcGFyYW0kc3BsaXQyWzBdLFxuICAgICAgICAgICAgICB2YWx1ZSA9IF9wYXJhbSRzcGxpdDJbMV07XG5cbiAgICAgICAgICBxdWVyeVBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyBOT1RFOiBXZSdyZSBhZGRpbmcgYW4gYWRkaXRpb25hbCB0aW1lc3RhbXAgdG8gdGhlIHF1ZXJ5LlxuICAgICAgLy8gVGhpcyBpcyB0byBwcmV2ZW50IGNlcnRhaW4gYnJvd3NlcnMgZnJvbSByZXR1cm5pbmcgY2FjaGVkXG4gICAgICAvLyB2ZXJzaW9ucyBvZiB0aGUgdXJsIHdlIGFyZSByZXF1ZXN0aW5nLlxuICAgICAgLy8gU2VlIHRoaXMgUFIgZm9yIG1vcmUgaW5mbzogaHR0cHM6Ly9naXRodWIuY29tL3BpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvcHVsbC80XG5cblxuICAgICAgdmFyIGNhY2hlYnVzdGluZ1BhcmFtcyA9IF9vYmplY3RTcHJlYWQyKHt9LCBxdWVyeVBhcmFtcywge1xuICAgICAgICBfOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBoYXNoVXJsID0gcXVlcnlsZXNzVXJsLnJlcGxhY2UoLyhbXiNdKykoLiopLywgZnVuY3Rpb24gKG1hdGNoLCBhZGRyZXNzLCBoYXNoKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChhZGRyZXNzLCBcIj9cIikuY29uY2F0KE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5LCBcIj1cIikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtc1trZXldKSk7XG4gICAgICAgIH0pLmpvaW4oJyYnKSkuY29uY2F0KGhhc2gpO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmVxdWVzdFVybCA9IHF1ZXJ5bGVzc1VybC5yZXBsYWNlKC8oW14jXSspKC4qKS8sIGZ1bmN0aW9uIChtYXRjaCwgYWRkcmVzcywgaGFzaCkge1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoYWRkcmVzcywgXCI/XCIpLmNvbmNhdChPYmplY3Qua2V5cyhjYWNoZWJ1c3RpbmdQYXJhbXMpLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiPVwiKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlYnVzdGluZ1BhcmFtc1trZXldKSk7XG4gICAgICAgIH0pLmpvaW4oJyYnKSkuY29uY2F0KGhhc2gpO1xuICAgICAgfSk7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGRhdGE7XG5cbiAgICAgICAgaWYgKGhhc2hVcmwgaW4gZGVmZXJyZWQpIHtcbiAgICAgICAgICByZXNvbHZlKGRlZmVycmVkW2hhc2hVcmxdKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWZlcnJlZFtoYXNoVXJsXSA9IHByb21pc2U7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgICAgICAgIGRhdGEgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhhc2hVcmwpO1xuXG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNoID09PSBkZXNlcmlhbGl6ZWQub3B0aW9ucy5oYXNoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZFtoYXNoVXJsXTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShkZXNlcmlhbGl6ZWQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbignR0VUJywgcmVxdWVzdFVybCwgdHJ1ZSk7XG5cbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZWwgPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgdmFyIG5ld09wdGlvbnMgPSB7fTtcbiAgICAgICAgICB2YXIgb3B0aW9uc0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtb3B0aW9uc10nKTtcblxuICAgICAgICAgIGlmIChvcHRpb25zRWwgJiYgb3B0aW9uc0VsLmlubmVySFRNTCkge1xuICAgICAgICAgICAgbmV3T3B0aW9ucyA9IEpTT04ucGFyc2UoZWwucXVlcnlTZWxlY3RvcignW2RhdGEtb3B0aW9uc10nKS5pbm5lckhUTUwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBodG1sRWxzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaHRtbF0nKTtcbiAgICAgICAgICB2YXIgbmV3SHRtbCA9IHt9O1xuXG4gICAgICAgICAgaWYgKGh0bWxFbHMubGVuZ3RoID09PSAxICYmIGh0bWxFbHNbMF0uZ2V0QXR0cmlidXRlKCdkYXRhLWh0bWwnKSA9PT0gJycpIHtcbiAgICAgICAgICAgIG5ld0h0bWwgPSBodG1sRWxzWzBdLmlubmVySFRNTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG1sRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIG5ld0h0bWxbaHRtbEVsc1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHRtbCcpXSA9IGh0bWxFbHNbaV0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkYXRhRWxzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGF0YV0nKTtcbiAgICAgICAgICB2YXIgbmV3RGF0YSA9IHt9O1xuXG4gICAgICAgICAgaWYgKGRhdGFFbHMubGVuZ3RoID09PSAxICYmIGRhdGFFbHNbMF0uZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGEnKSA9PT0gJycpIHtcbiAgICAgICAgICAgIG5ld0RhdGEgPSBKU09OLnBhcnNlKGRhdGFFbHNbMF0uaW5uZXJIVE1MKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRhdGFFbHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG5ld0RhdGFbZGF0YUVsc1tfaV0uZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGEnKV0gPSBKU09OLnBhcnNlKGRhdGFFbHNbX2ldLmlubmVySFRNTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoYXNoVXJsLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgb3B0aW9uczogbmV3T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBkYXRhOiBuZXdEYXRhLFxuICAgICAgICAgICAgICAgIGh0bWw6IG5ld0h0bWxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVsZXRlIGRlZmVycmVkW2hhc2hVcmxdO1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgZGF0YTogbmV3RGF0YSxcbiAgICAgICAgICAgIGh0bWw6IG5ld0h0bWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkZWxldGUgZGVmZXJyZWRbaGFzaFVybF07XG4gICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY1ZpZXc7XG59KCk7XG5cbnZhciBldkVtaXR0ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKipcbiAqIEV2RW1pdHRlciB2MS4xLjBcbiAqIExpbCcgZXZlbnQgZW1pdHRlclxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4vKiBqc2hpbnQgdW51c2VkOiB0cnVlLCB1bmRlZjogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHdpbmRvdyAqL1xuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KUyAtIEJyb3dzZXJpZnksIFdlYnBhY2tcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcbiAgICBnbG9iYWwuRXZFbWl0dGVyID0gZmFjdG9yeSgpO1xuICB9XG5cbn0oIHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24oKSB7XG5cbmZ1bmN0aW9uIEV2RW1pdHRlcigpIHt9XG5cbnZhciBwcm90byA9IEV2RW1pdHRlci5wcm90b3R5cGU7XG5cbnByb3RvLm9uID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIGlmICggIWV2ZW50TmFtZSB8fCAhbGlzdGVuZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHNldCBldmVudHMgaGFzaFxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICAvLyBzZXQgbGlzdGVuZXJzIGFycmF5XG4gIHZhciBsaXN0ZW5lcnMgPSBldmVudHNbIGV2ZW50TmFtZSBdID0gZXZlbnRzWyBldmVudE5hbWUgXSB8fCBbXTtcbiAgLy8gb25seSBhZGQgb25jZVxuICBpZiAoIGxpc3RlbmVycy5pbmRleE9mKCBsaXN0ZW5lciApID09IC0xICkge1xuICAgIGxpc3RlbmVycy5wdXNoKCBsaXN0ZW5lciApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vbmNlID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIGlmICggIWV2ZW50TmFtZSB8fCAhbGlzdGVuZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGFkZCBldmVudFxuICB0aGlzLm9uKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gIC8vIHNldCBvbmNlIGZsYWdcbiAgLy8gc2V0IG9uY2VFdmVudHMgaGFzaFxuICB2YXIgb25jZUV2ZW50cyA9IHRoaXMuX29uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzIHx8IHt9O1xuICAvLyBzZXQgb25jZUxpc3RlbmVycyBvYmplY3RcbiAgdmFyIG9uY2VMaXN0ZW5lcnMgPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSA9IG9uY2VFdmVudHNbIGV2ZW50TmFtZSBdIHx8IHt9O1xuICAvLyBzZXQgZmxhZ1xuICBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLm9mZiA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzICYmIHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF07XG4gIGlmICggIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoIGxpc3RlbmVyICk7XG4gIGlmICggaW5kZXggIT0gLTEgKSB7XG4gICAgbGlzdGVuZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8uZW1pdEV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgYXJncyApIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNvcHkgb3ZlciB0byBhdm9pZCBpbnRlcmZlcmVuY2UgaWYgLm9mZigpIGluIGxpc3RlbmVyXG4gIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgwKTtcbiAgYXJncyA9IGFyZ3MgfHwgW107XG4gIC8vIG9uY2Ugc3R1ZmZcbiAgdmFyIG9uY2VMaXN0ZW5lcnMgPSB0aGlzLl9vbmNlRXZlbnRzICYmIHRoaXMuX29uY2VFdmVudHNbIGV2ZW50TmFtZSBdO1xuXG4gIGZvciAoIHZhciBpPTA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgIHZhciBpc09uY2UgPSBvbmNlTGlzdGVuZXJzICYmIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgaWYgKCBpc09uY2UgKSB7XG4gICAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICAgIC8vIHJlbW92ZSBiZWZvcmUgdHJpZ2dlciB0byBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgdGhpcy5vZmYoIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgICAgIC8vIHVuc2V0IG9uY2UgZmxhZ1xuICAgICAgZGVsZXRlIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5hcHBseSggdGhpcywgYXJncyApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5hbGxPZmYgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgZGVsZXRlIHRoaXMuX29uY2VFdmVudHM7XG59O1xuXG5yZXR1cm4gRXZFbWl0dGVyO1xuXG59KSk7XG59KTtcblxudmFyIGdldFNpemUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKiFcbiAqIGdldFNpemUgdjIuMC4zXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLyoganNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuLyogZ2xvYmFscyBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUgKi9cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5nZXRTaXplID0gZmFjdG9yeSgpO1xuICB9XG5cbn0pKCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2V0IGEgbnVtYmVyIGZyb20gYSBzdHJpbmcsIG5vdCBhIHBlcmNlbnRhZ2VcbmZ1bmN0aW9uIGdldFN0eWxlU2l6ZSggdmFsdWUgKSB7XG4gIHZhciBudW0gPSBwYXJzZUZsb2F0KCB2YWx1ZSApO1xuICAvLyBub3QgYSBwZXJjZW50IGxpa2UgJzEwMCUnLCBhbmQgYSBudW1iZXJcbiAgdmFyIGlzVmFsaWQgPSB2YWx1ZS5pbmRleE9mKCclJykgPT0gLTEgJiYgIWlzTmFOKCBudW0gKTtcbiAgcmV0dXJuIGlzVmFsaWQgJiYgbnVtO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIGxvZ0Vycm9yID0gdHlwZW9mIGNvbnNvbGUgPT0gJ3VuZGVmaW5lZCcgPyBub29wIDpcbiAgZnVuY3Rpb24oIG1lc3NhZ2UgKSB7XG4gICAgY29uc29sZS5lcnJvciggbWVzc2FnZSApO1xuICB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZWFzdXJlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIG1lYXN1cmVtZW50cyA9IFtcbiAgJ3BhZGRpbmdMZWZ0JyxcbiAgJ3BhZGRpbmdSaWdodCcsXG4gICdwYWRkaW5nVG9wJyxcbiAgJ3BhZGRpbmdCb3R0b20nLFxuICAnbWFyZ2luTGVmdCcsXG4gICdtYXJnaW5SaWdodCcsXG4gICdtYXJnaW5Ub3AnLFxuICAnbWFyZ2luQm90dG9tJyxcbiAgJ2JvcmRlckxlZnRXaWR0aCcsXG4gICdib3JkZXJSaWdodFdpZHRoJyxcbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlckJvdHRvbVdpZHRoJ1xuXTtcblxudmFyIG1lYXN1cmVtZW50c0xlbmd0aCA9IG1lYXN1cmVtZW50cy5sZW5ndGg7XG5cbmZ1bmN0aW9uIGdldFplcm9TaXplKCkge1xuICB2YXIgc2l6ZSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgaW5uZXJXaWR0aDogMCxcbiAgICBpbm5lckhlaWdodDogMCxcbiAgICBvdXRlcldpZHRoOiAwLFxuICAgIG91dGVySGVpZ2h0OiAwXG4gIH07XG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0U3R5bGUsIGdldCBzdHlsZSBvZiBlbGVtZW50LCBjaGVjayBmb3IgRmlyZWZveCBidWdcbiAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuICovXG5mdW5jdGlvbiBnZXRTdHlsZSggZWxlbSApIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuICBpZiAoICFzdHlsZSApIHtcbiAgICBsb2dFcnJvciggJ1N0eWxlIHJldHVybmVkICcgKyBzdHlsZSArXG4gICAgICAnLiBBcmUgeW91IHJ1bm5pbmcgdGhpcyBjb2RlIGluIGEgaGlkZGVuIGlmcmFtZSBvbiBGaXJlZm94PyAnICtcbiAgICAgICdTZWUgaHR0cHM6Ly9iaXQubHkvZ2V0c2l6ZWJ1ZzEnICk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgaXNTZXR1cCA9IGZhbHNlO1xuXG52YXIgaXNCb3hTaXplT3V0ZXI7XG5cbi8qKlxuICogc2V0dXBcbiAqIGNoZWNrIGlzQm94U2l6ZXJPdXRlclxuICogZG8gb24gZmlyc3QgZ2V0U2l6ZSgpIHJhdGhlciB0aGFuIG9uIHBhZ2UgbG9hZCBmb3IgRmlyZWZveCBidWdcbiAqL1xuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIC8vIHNldHVwIG9uY2VcbiAgaWYgKCBpc1NldHVwICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc1NldHVwID0gdHJ1ZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBib3ggc2l6aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLyoqXG4gICAqIENocm9tZSAmIFNhZmFyaSBtZWFzdXJlIHRoZSBvdXRlci13aWR0aCBvbiBzdHlsZS53aWR0aCBvbiBib3JkZXItYm94IGVsZW1zXG4gICAqIElFMTEgJiBGaXJlZm94PDI5IG1lYXN1cmVzIHRoZSBpbm5lci13aWR0aFxuICAgKi9cbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuICBkaXYuc3R5bGUucGFkZGluZyA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4IDJweCAzcHggNHB4JztcbiAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICBib2R5LmFwcGVuZENoaWxkKCBkaXYgKTtcbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGRpdiApO1xuICAvLyByb3VuZCB2YWx1ZSBmb3IgYnJvd3NlciB6b29tLiBkZXNhbmRyby9tYXNvbnJ5IzkyOFxuICBpc0JveFNpemVPdXRlciA9IE1hdGgucm91bmQoIGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKSApID09IDIwMDtcbiAgZ2V0U2l6ZS5pc0JveFNpemVPdXRlciA9IGlzQm94U2l6ZU91dGVyO1xuXG4gIGJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXRTaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIGdldFNpemUoIGVsZW0gKSB7XG4gIHNldHVwKCk7XG5cbiAgLy8gdXNlIHF1ZXJ5U2VsZXRvciBpZiBlbGVtIGlzIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtID09ICdzdHJpbmcnICkge1xuICAgIGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbGVtICk7XG4gIH1cblxuICAvLyBkbyBub3QgcHJvY2VlZCBvbiBub24tb2JqZWN0c1xuICBpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtICE9ICdvYmplY3QnIHx8ICFlbGVtLm5vZGVUeXBlICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGdldFN0eWxlKCBlbGVtICk7XG5cbiAgLy8gaWYgaGlkZGVuLCBldmVyeXRoaW5nIGlzIDBcbiAgaWYgKCBzdHlsZS5kaXNwbGF5ID09ICdub25lJyApIHtcbiAgICByZXR1cm4gZ2V0WmVyb1NpemUoKTtcbiAgfVxuXG4gIHZhciBzaXplID0ge307XG4gIHNpemUud2lkdGggPSBlbGVtLm9mZnNldFdpZHRoO1xuICBzaXplLmhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0O1xuXG4gIHZhciBpc0JvcmRlckJveCA9IHNpemUuaXNCb3JkZXJCb3ggPSBzdHlsZS5ib3hTaXppbmcgPT0gJ2JvcmRlci1ib3gnO1xuXG4gIC8vIGdldCBhbGwgbWVhc3VyZW1lbnRzXG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgdmFyIHZhbHVlID0gc3R5bGVbIG1lYXN1cmVtZW50IF07XG4gICAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gICAgLy8gYW55ICdhdXRvJywgJ21lZGl1bScgdmFsdWUgd2lsbCBiZSAwXG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9ICFpc05hTiggbnVtICkgPyBudW0gOiAwO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdXaWR0aCA9IHNpemUucGFkZGluZ0xlZnQgKyBzaXplLnBhZGRpbmdSaWdodDtcbiAgdmFyIHBhZGRpbmdIZWlnaHQgPSBzaXplLnBhZGRpbmdUb3AgKyBzaXplLnBhZGRpbmdCb3R0b207XG4gIHZhciBtYXJnaW5XaWR0aCA9IHNpemUubWFyZ2luTGVmdCArIHNpemUubWFyZ2luUmlnaHQ7XG4gIHZhciBtYXJnaW5IZWlnaHQgPSBzaXplLm1hcmdpblRvcCArIHNpemUubWFyZ2luQm90dG9tO1xuICB2YXIgYm9yZGVyV2lkdGggPSBzaXplLmJvcmRlckxlZnRXaWR0aCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aDtcbiAgdmFyIGJvcmRlckhlaWdodCA9IHNpemUuYm9yZGVyVG9wV2lkdGggKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuXG4gIHZhciBpc0JvcmRlckJveFNpemVPdXRlciA9IGlzQm9yZGVyQm94ICYmIGlzQm94U2l6ZU91dGVyO1xuXG4gIC8vIG92ZXJ3cml0ZSB3aWR0aCBhbmQgaGVpZ2h0IGlmIHdlIGNhbiBnZXQgaXQgZnJvbSBzdHlsZVxuICB2YXIgc3R5bGVXaWR0aCA9IGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKTtcbiAgaWYgKCBzdHlsZVdpZHRoICE9PSBmYWxzZSApIHtcbiAgICBzaXplLndpZHRoID0gc3R5bGVXaWR0aCArXG4gICAgICAvLyBhZGQgcGFkZGluZyBhbmQgYm9yZGVyIHVubGVzcyBpdCdzIGFscmVhZHkgaW5jbHVkaW5nIGl0XG4gICAgICAoIGlzQm9yZGVyQm94U2l6ZU91dGVyID8gMCA6IHBhZGRpbmdXaWR0aCArIGJvcmRlcldpZHRoICk7XG4gIH1cblxuICB2YXIgc3R5bGVIZWlnaHQgPSBnZXRTdHlsZVNpemUoIHN0eWxlLmhlaWdodCApO1xuICBpZiAoIHN0eWxlSGVpZ2h0ICE9PSBmYWxzZSApIHtcbiAgICBzaXplLmhlaWdodCA9IHN0eWxlSGVpZ2h0ICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ0hlaWdodCArIGJvcmRlckhlaWdodCApO1xuICB9XG5cbiAgc2l6ZS5pbm5lcldpZHRoID0gc2l6ZS53aWR0aCAtICggcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgc2l6ZS5pbm5lckhlaWdodCA9IHNpemUuaGVpZ2h0IC0gKCBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG5cbiAgc2l6ZS5vdXRlcldpZHRoID0gc2l6ZS53aWR0aCArIG1hcmdpbldpZHRoO1xuICBzaXplLm91dGVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyBtYXJnaW5IZWlnaHQ7XG5cbiAgcmV0dXJuIHNpemU7XG59XG5cbnJldHVybiBnZXRTaXplO1xuXG59KTtcbn0pO1xuXG52YXIgbWF0Y2hlc1NlbGVjdG9yID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLyoqXG4gKiBtYXRjaGVzU2VsZWN0b3IgdjIuMC4yXG4gKiBtYXRjaGVzU2VsZWN0b3IoIGVsZW1lbnQsICcuc2VsZWN0b3InIClcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgc3RyaWN0OiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yID0gZmFjdG9yeSgpO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcblxuICB2YXIgbWF0Y2hlc01ldGhvZCA9ICggZnVuY3Rpb24oKSB7XG4gICAgdmFyIEVsZW1Qcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgICAvLyBjaGVjayBmb3IgdGhlIHN0YW5kYXJkIG1ldGhvZCBuYW1lIGZpcnN0XG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlcyApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlcyc7XG4gICAgfVxuICAgIC8vIGNoZWNrIHVuLXByZWZpeGVkXG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuICdtYXRjaGVzU2VsZWN0b3InO1xuICAgIH1cbiAgICAvLyBjaGVjayB2ZW5kb3IgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBbICd3ZWJraXQnLCAnbW96JywgJ21zJywgJ28nIF07XG5cbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcHJlZml4ICsgJ01hdGNoZXNTZWxlY3Rvcic7XG4gICAgICBpZiAoIEVsZW1Qcm90b1sgbWV0aG9kIF0gKSB7XG4gICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoIGVsZW0sIHNlbGVjdG9yICkge1xuICAgIHJldHVybiBlbGVtWyBtYXRjaGVzTWV0aG9kIF0oIHNlbGVjdG9yICk7XG4gIH07XG5cbn0pKTtcbn0pO1xuXG52YXIgdXRpbHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIG1hdGNoZXNTZWxlY3RvclxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuZml6enlVSVV0aWxzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5tYXRjaGVzU2VsZWN0b3JcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBtYXRjaGVzU2VsZWN0b3IgKSB7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG59KTtcblxudmFyIGNlbGwgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBGbGlja2l0eS5DZWxsXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICBnZXRTaXplXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuQ2VsbCA9IGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBnZXRTaXplICkge1xuXG5mdW5jdGlvbiBDZWxsKCBlbGVtLCBwYXJlbnQgKSB7XG4gIHRoaXMuZWxlbWVudCA9IGVsZW07XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gIHRoaXMuY3JlYXRlKCk7XG59XG5cbnZhciBwcm90byA9IENlbGwucHJvdG90eXBlO1xuXG5wcm90by5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMuc2hpZnQgPSAwO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIHRoaXMucGFyZW50Lm9yaWdpblNpZGUgXSA9IDA7XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlc2V0IHN0eWxlXG4gIHRoaXMudW5zZWxlY3QoKTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJyc7XG4gIHZhciBzaWRlID0gdGhpcy5wYXJlbnQub3JpZ2luU2lkZTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlWyBzaWRlIF0gPSAnJztcbiAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMudXBkYXRlVGFyZ2V0KCk7XG4gIHRoaXMucmVuZGVyUG9zaXRpb24oIHggKTtcbn07XG5cbi8vIHNldERlZmF1bHRUYXJnZXQgdjEgbWV0aG9kLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVtb3ZlIGluIHYzXG5wcm90by51cGRhdGVUYXJnZXQgPSBwcm90by5zZXREZWZhdWx0VGFyZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtYXJnaW5Qcm9wZXJ0eSA9IHRoaXMucGFyZW50Lm9yaWdpblNpZGUgPT0gJ2xlZnQnID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgdGhpcy50YXJnZXQgPSB0aGlzLnggKyB0aGlzLnNpemVbIG1hcmdpblByb3BlcnR5IF0gK1xuICAgIHRoaXMuc2l6ZS53aWR0aCAqIHRoaXMucGFyZW50LmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLnJlbmRlclBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHJlbmRlciBwb3NpdGlvbiBvZiBjZWxsIHdpdGggaW4gc2xpZGVyXG4gIHZhciBzaWRlT2Zmc2V0ID0gdGhpcy5wYXJlbnQub3JpZ2luU2lkZSA9PT0gJ2xlZnQnID8gMSA6IC0xO1xuXG4gIHZhciBhZGp1c3RlZFggPSB0aGlzLnBhcmVudC5vcHRpb25zLnBlcmNlbnRQb3NpdGlvbiA/XG4gICAgeCAqIHNpZGVPZmZzZXQgKiAoIHRoaXMucGFyZW50LnNpemUuaW5uZXJXaWR0aCAvIHRoaXMuc2l6ZS53aWR0aCApIDpcbiAgICB4ICogc2lkZU9mZnNldDtcblxuICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoJyArXG4gICAgdGhpcy5wYXJlbnQuZ2V0UG9zaXRpb25WYWx1ZSggYWRqdXN0ZWRYICkgKyAnKSc7XG59O1xuXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzLXNlbGVjdGVkJyk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtc2VsZWN0ZWQnKTtcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc2hpZnQgLSAwLCAxLCBvciAtMVxuICovXG5wcm90by53cmFwU2hpZnQgPSBmdW5jdGlvbiggc2hpZnQgKSB7XG4gIHRoaXMuc2hpZnQgPSBzaGlmdDtcbiAgdGhpcy5yZW5kZXJQb3NpdGlvbiggdGhpcy54ICsgdGhpcy5wYXJlbnQuc2xpZGVhYmxlV2lkdGggKiBzaGlmdCApO1xufTtcblxucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbnJldHVybiBDZWxsO1xuXG59ICkgKTtcbn0pO1xuXG52YXIgc2xpZGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBzbGlkZVxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuU2xpZGUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuXG5mdW5jdGlvbiBTbGlkZSggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5pc09yaWdpbkxlZnQgPSBwYXJlbnQub3JpZ2luU2lkZSA9PSAnbGVmdCc7XG4gIHRoaXMuY2VsbHMgPSBbXTtcbiAgdGhpcy5vdXRlcldpZHRoID0gMDtcbiAgdGhpcy5oZWlnaHQgPSAwO1xufVxuXG52YXIgcHJvdG8gPSBTbGlkZS5wcm90b3R5cGU7XG5cbnByb3RvLmFkZENlbGwgPSBmdW5jdGlvbiggY2VsbCApIHtcbiAgdGhpcy5jZWxscy5wdXNoKCBjZWxsICk7XG4gIHRoaXMub3V0ZXJXaWR0aCArPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heCggY2VsbC5zaXplLm91dGVySGVpZ2h0LCB0aGlzLmhlaWdodCApO1xuICAvLyBmaXJzdCBjZWxsIHN0dWZmXG4gIGlmICggdGhpcy5jZWxscy5sZW5ndGggPT0gMSApIHtcbiAgICB0aGlzLnggPSBjZWxsLng7IC8vIHggY29tZXMgZnJvbSBmaXJzdCBjZWxsXG4gICAgdmFyIGJlZ2luTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHRoaXMuZmlyc3RNYXJnaW4gPSBjZWxsLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIH1cbn07XG5cbnByb3RvLnVwZGF0ZVRhcmdldCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZW5kTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnO1xuICB2YXIgbGFzdENlbGwgPSB0aGlzLmdldExhc3RDZWxsKCk7XG4gIHZhciBsYXN0TWFyZ2luID0gbGFzdENlbGwgPyBsYXN0Q2VsbC5zaXplWyBlbmRNYXJnaW4gXSA6IDA7XG4gIHZhciBzbGlkZVdpZHRoID0gdGhpcy5vdXRlcldpZHRoIC0gKCB0aGlzLmZpcnN0TWFyZ2luICsgbGFzdE1hcmdpbiApO1xuICB0aGlzLnRhcmdldCA9IHRoaXMueCArIHRoaXMuZmlyc3RNYXJnaW4gKyBzbGlkZVdpZHRoICogdGhpcy5wYXJlbnQuY2VsbEFsaWduO1xufTtcblxucHJvdG8uZ2V0TGFzdENlbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHNbIHRoaXMuY2VsbHMubGVuZ3RoIC0gMSBdO1xufTtcblxucHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5zZWxlY3QoKTtcbiAgfSApO1xufTtcblxucHJvdG8udW5zZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jZWxscy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICBjZWxsLnVuc2VsZWN0KCk7XG4gIH0gKTtcbn07XG5cbnByb3RvLmdldENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jZWxscy5tYXAoIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIHJldHVybiBjZWxsLmVsZW1lbnQ7XG4gIH0gKTtcbn07XG5cbnJldHVybiBTbGlkZTtcblxufSApICk7XG59KTtcblxudmFyIGFuaW1hdGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBhbmltYXRlXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuRmxpY2tpdHkgPSB3aW5kb3cuRmxpY2tpdHkgfHwge307XG4gICAgd2luZG93LkZsaWNraXR5LmFuaW1hdGVQcm90b3R5cGUgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCB1dGlscyApIHtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYW5pbWF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSB7fTtcblxucHJvdG8uc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzQW5pbWF0aW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICB0aGlzLmFuaW1hdGUoKTtcbn07XG5cbnByb3RvLmFuaW1hdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5hcHBseURyYWdGb3JjZSgpO1xuICB0aGlzLmFwcGx5U2VsZWN0ZWRBdHRyYWN0aW9uKCk7XG5cbiAgdmFyIHByZXZpb3VzWCA9IHRoaXMueDtcblxuICB0aGlzLmludGVncmF0ZVBoeXNpY3MoKTtcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xuICB0aGlzLnNldHRsZSggcHJldmlvdXNYICk7XG4gIC8vIGFuaW1hdGUgbmV4dCBmcmFtZVxuICBpZiAoIHRoaXMuaXNBbmltYXRpbmcgKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGZ1bmN0aW9uIGFuaW1hdGVGcmFtZSgpIHtcbiAgICAgIF90aGlzLmFuaW1hdGUoKTtcbiAgICB9ICk7XG4gIH1cbn07XG5cbnByb3RvLnBvc2l0aW9uU2xpZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciB4ID0gdGhpcy54O1xuICAvLyB3cmFwIHBvc2l0aW9uIGFyb3VuZFxuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICYmIHRoaXMuY2VsbHMubGVuZ3RoID4gMSApIHtcbiAgICB4ID0gdXRpbHMubW9kdWxvKCB4LCB0aGlzLnNsaWRlYWJsZVdpZHRoICk7XG4gICAgeCAtPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICAgIHRoaXMuc2hpZnRXcmFwQ2VsbHMoIHggKTtcbiAgfVxuXG4gIHRoaXMuc2V0VHJhbnNsYXRlWCggeCwgdGhpcy5pc0FuaW1hdGluZyApO1xuICB0aGlzLmRpc3BhdGNoU2Nyb2xsRXZlbnQoKTtcbn07XG5cbnByb3RvLnNldFRyYW5zbGF0ZVggPSBmdW5jdGlvbiggeCwgaXMzZCApIHtcbiAgeCArPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICAvLyByZXZlcnNlIGlmIHJpZ2h0LXRvLWxlZnQgYW5kIHVzaW5nIHRyYW5zZm9ybVxuICB4ID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gLXggOiB4O1xuICB2YXIgdHJhbnNsYXRlWCA9IHRoaXMuZ2V0UG9zaXRpb25WYWx1ZSggeCApO1xuICAvLyB1c2UgM0QgdHJhbnNmb3JtcyBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG9uIGlPU1xuICAvLyBidXQgdXNlIDJEIHdoZW4gc2V0dGxlZCwgZm9yIGJldHRlciBmb250LXJlbmRlcmluZ1xuICB0aGlzLnNsaWRlci5zdHlsZS50cmFuc2Zvcm0gPSBpczNkID9cbiAgICAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAnLDAsMCknIDogJ3RyYW5zbGF0ZVgoJyArIHRyYW5zbGF0ZVggKyAnKSc7XG59O1xuXG5wcm90by5kaXNwYXRjaFNjcm9sbEV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaXJzdFNsaWRlID0gdGhpcy5zbGlkZXNbMF07XG4gIGlmICggIWZpcnN0U2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBwb3NpdGlvblggPSAtdGhpcy54IC0gZmlyc3RTbGlkZS50YXJnZXQ7XG4gIHZhciBwcm9ncmVzcyA9IHBvc2l0aW9uWCAvIHRoaXMuc2xpZGVzV2lkdGg7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3Njcm9sbCcsIG51bGwsIFsgcHJvZ3Jlc3MsIHBvc2l0aW9uWCBdICk7XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMueCA9IC10aGlzLnNlbGVjdGVkU2xpZGUudGFyZ2V0O1xuICB0aGlzLnZlbG9jaXR5ID0gMDsgLy8gc3RvcCB3b2JibGVcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xufTtcblxucHJvdG8uZ2V0UG9zaXRpb25WYWx1ZSA9IGZ1bmN0aW9uKCBwb3NpdGlvbiApIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICkge1xuICAgIC8vIHBlcmNlbnQgcG9zaXRpb24sIHJvdW5kIHRvIDIgZGlnaXRzLCBsaWtlIDEyLjM0JVxuICAgIHJldHVybiAoIE1hdGgucm91bmQoICggcG9zaXRpb24gLyB0aGlzLnNpemUuaW5uZXJXaWR0aCApICogMTAwMDAgKSAqIDAuMDEgKSArICclJztcbiAgfSBlbHNlIHtcbiAgICAvLyBwaXhlbCBwb3NpdGlvbmluZ1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCBwb3NpdGlvbiApICsgJ3B4JztcbiAgfVxufTtcblxucHJvdG8uc2V0dGxlID0gZnVuY3Rpb24oIHByZXZpb3VzWCApIHtcbiAgLy8ga2VlcCB0cmFjayBvZiBmcmFtZXMgd2hlcmUgeCBoYXNuJ3QgbW92ZWRcbiAgdmFyIGlzUmVzdGluZyA9ICF0aGlzLmlzUG9pbnRlckRvd24gJiZcbiAgICAgIE1hdGgucm91bmQoIHRoaXMueCAqIDEwMCApID09IE1hdGgucm91bmQoIHByZXZpb3VzWCAqIDEwMCApO1xuICBpZiAoIGlzUmVzdGluZyApIHtcbiAgICB0aGlzLnJlc3RpbmdGcmFtZXMrKztcbiAgfVxuICAvLyBzdG9wIGFuaW1hdGluZyBpZiByZXN0aW5nIGZvciAzIG9yIG1vcmUgZnJhbWVzXG4gIGlmICggdGhpcy5yZXN0aW5nRnJhbWVzID4gMiApIHtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xuICAgIC8vIHJlbmRlciBwb3NpdGlvbiB3aXRoIHRyYW5zbGF0ZVggd2hlbiBzZXR0bGVkXG4gICAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3NldHRsZScsIG51bGwsIFsgdGhpcy5zZWxlY3RlZEluZGV4IF0gKTtcbiAgfVxufTtcblxucHJvdG8uc2hpZnRXcmFwQ2VsbHMgPSBmdW5jdGlvbiggeCApIHtcbiAgLy8gc2hpZnQgYmVmb3JlIGNlbGxzXG4gIHZhciBiZWZvcmVHYXAgPSB0aGlzLmN1cnNvclBvc2l0aW9uICsgeDtcbiAgdGhpcy5fc2hpZnRDZWxscyggdGhpcy5iZWZvcmVTaGlmdENlbGxzLCBiZWZvcmVHYXAsIC0xICk7XG4gIC8vIHNoaWZ0IGFmdGVyIGNlbGxzXG4gIHZhciBhZnRlckdhcCA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoIC0gKCB4ICsgdGhpcy5zbGlkZWFibGVXaWR0aCArIHRoaXMuY3Vyc29yUG9zaXRpb24gKTtcbiAgdGhpcy5fc2hpZnRDZWxscyggdGhpcy5hZnRlclNoaWZ0Q2VsbHMsIGFmdGVyR2FwLCAxICk7XG59O1xuXG5wcm90by5fc2hpZnRDZWxscyA9IGZ1bmN0aW9uKCBjZWxscywgZ2FwLCBzaGlmdCApIHtcbiAgZm9yICggdmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSBjZWxsc1tpXTtcbiAgICB2YXIgY2VsbFNoaWZ0ID0gZ2FwID4gMCA/IHNoaWZ0IDogMDtcbiAgICBjZWxsLndyYXBTaGlmdCggY2VsbFNoaWZ0ICk7XG4gICAgZ2FwIC09IGNlbGwuc2l6ZS5vdXRlcldpZHRoO1xuICB9XG59O1xuXG5wcm90by5fdW5zaGlmdENlbGxzID0gZnVuY3Rpb24oIGNlbGxzICkge1xuICBpZiAoICFjZWxscyB8fCAhY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICBjZWxsc1tpXS53cmFwU2hpZnQoIDAgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGh5c2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5pbnRlZ3JhdGVQaHlzaWNzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMueCArPSB0aGlzLnZlbG9jaXR5O1xuICB0aGlzLnZlbG9jaXR5ICo9IHRoaXMuZ2V0RnJpY3Rpb25GYWN0b3IoKTtcbn07XG5cbnByb3RvLmFwcGx5Rm9yY2UgPSBmdW5jdGlvbiggZm9yY2UgKSB7XG4gIHRoaXMudmVsb2NpdHkgKz0gZm9yY2U7XG59O1xuXG5wcm90by5nZXRGcmljdGlvbkZhY3RvciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gMSAtIHRoaXMub3B0aW9uc1sgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPyAnZnJlZVNjcm9sbEZyaWN0aW9uJyA6ICdmcmljdGlvbicgXTtcbn07XG5cbnByb3RvLmdldFJlc3RpbmdQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBteSB0aGFua3MgdG8gU3RldmVuIFdpdHRlbnMsIHdobyBzaW1wbGlmaWVkIHRoaXMgbWF0aCBncmVhdGx5XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLnZlbG9jaXR5IC8gKCAxIC0gdGhpcy5nZXRGcmljdGlvbkZhY3RvcigpICk7XG59O1xuXG5wcm90by5hcHBseURyYWdGb3JjZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlIHx8ICF0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNoYW5nZSB0aGUgcG9zaXRpb24gdG8gZHJhZyBwb3NpdGlvbiBieSBhcHBseWluZyBmb3JjZVxuICB2YXIgZHJhZ1ZlbG9jaXR5ID0gdGhpcy5kcmFnWCAtIHRoaXMueDtcbiAgdmFyIGRyYWdGb3JjZSA9IGRyYWdWZWxvY2l0eSAtIHRoaXMudmVsb2NpdHk7XG4gIHRoaXMuYXBwbHlGb3JjZSggZHJhZ0ZvcmNlICk7XG59O1xuXG5wcm90by5hcHBseVNlbGVjdGVkQXR0cmFjdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBkbyBub3QgYXR0cmFjdCBpZiBwb2ludGVyIGRvd24gb3Igbm8gc2xpZGVzXG4gIHZhciBkcmFnRG93biA9IHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5pc1BvaW50ZXJEb3duO1xuICBpZiAoIGRyYWdEb3duIHx8IHRoaXMuaXNGcmVlU2Nyb2xsaW5nIHx8ICF0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBkaXN0YW5jZSA9IHRoaXMuc2VsZWN0ZWRTbGlkZS50YXJnZXQgKiAtMSAtIHRoaXMueDtcbiAgdmFyIGZvcmNlID0gZGlzdGFuY2UgKiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRBdHRyYWN0aW9uO1xuICB0aGlzLmFwcGx5Rm9yY2UoIGZvcmNlICk7XG59O1xuXG5yZXR1cm4gcHJvdG87XG5cbn0gKSApO1xufSk7XG5cbnZhciBmbGlja2l0eSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIEZsaWNraXR5IG1haW5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1wYXJhbXMgKi9cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGV2RW1pdHRlcixcbiAgICAgICAgZ2V0U2l6ZSxcbiAgICAgICAgdXRpbHMsXG4gICAgICAgIGNlbGwsXG4gICAgICAgIHNsaWRlLFxuICAgICAgICBhbmltYXRlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHZhciBfRmxpY2tpdHkgPSB3aW5kb3cuRmxpY2tpdHk7XG5cbiAgICB3aW5kb3cuRmxpY2tpdHkgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICAgIHdpbmRvdy5nZXRTaXplLFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzLFxuICAgICAgICBfRmxpY2tpdHkuQ2VsbCxcbiAgICAgICAgX0ZsaWNraXR5LlNsaWRlLFxuICAgICAgICBfRmxpY2tpdHkuYW5pbWF0ZVByb3RvdHlwZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSxcbiAgICB1dGlscywgQ2VsbCwgU2xpZGUsIGFuaW1hdGVQcm90b3R5cGUgKSB7XG5cbi8vIHZhcnNcbnZhciBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xudmFyIGdldENvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtcbnZhciBjb25zb2xlID0gd2luZG93LmNvbnNvbGU7XG5cbmZ1bmN0aW9uIG1vdmVFbGVtZW50cyggZWxlbXMsIHRvRWxlbSApIHtcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHdoaWxlICggZWxlbXMubGVuZ3RoICkge1xuICAgIHRvRWxlbS5hcHBlbmRDaGlsZCggZWxlbXMuc2hpZnQoKSApO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xudmFyIEdVSUQgPSAwO1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIEZsaWNraXR5IGludGFuY2VzXG52YXIgaW5zdGFuY2VzID0ge307XG5cbmZ1bmN0aW9uIEZsaWNraXR5KCBlbGVtZW50LCBvcHRpb25zICkge1xuICB2YXIgcXVlcnlFbGVtZW50ID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtZW50ICk7XG4gIGlmICggIXF1ZXJ5RWxlbWVudCApIHtcbiAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCAnQmFkIGVsZW1lbnQgZm9yIEZsaWNraXR5OiAnICsgKCBxdWVyeUVsZW1lbnQgfHwgZWxlbWVudCApICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQgPSBxdWVyeUVsZW1lbnQ7XG4gIC8vIGRvIG5vdCBpbml0aWFsaXplIHR3aWNlIG9uIHNhbWUgZWxlbWVudFxuICBpZiAoIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQgKSB7XG4gICAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzWyB0aGlzLmVsZW1lbnQuZmxpY2tpdHlHVUlEIF07XG4gICAgaWYgKCBpbnN0YW5jZSApIGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8vIGFkZCBqUXVlcnlcbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGpRdWVyeSggdGhpcy5lbGVtZW50ICk7XG4gIH1cbiAgLy8gb3B0aW9uc1xuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5leHRlbmQoIHt9LCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRzICk7XG4gIHRoaXMub3B0aW9uKCBvcHRpb25zICk7XG5cbiAgLy8ga2ljayB0aGluZ3Mgb2ZmXG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG5GbGlja2l0eS5kZWZhdWx0cyA9IHtcbiAgYWNjZXNzaWJpbGl0eTogdHJ1ZSxcbiAgLy8gYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICBjZWxsQWxpZ246ICdjZW50ZXInLFxuICAvLyBjZWxsU2VsZWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gY29udGFpbjogZmFsc2UsXG4gIGZyZWVTY3JvbGxGcmljdGlvbjogMC4wNzUsIC8vIGZyaWN0aW9uIHdoZW4gZnJlZS1zY3JvbGxpbmdcbiAgZnJpY3Rpb246IDAuMjgsIC8vIGZyaWN0aW9uIHdoZW4gc2VsZWN0aW5nXG4gIG5hbWVzcGFjZUpRdWVyeUV2ZW50czogdHJ1ZSxcbiAgLy8gaW5pdGlhbEluZGV4OiAwLFxuICBwZXJjZW50UG9zaXRpb246IHRydWUsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgc2VsZWN0ZWRBdHRyYWN0aW9uOiAwLjAyNSxcbiAgc2V0R2FsbGVyeVNpemU6IHRydWUsXG4gIC8vIHdhdGNoQ1NTOiBmYWxzZSxcbiAgLy8gd3JhcEFyb3VuZDogZmFsc2Vcbn07XG5cbi8vIGhhc2ggb2YgbWV0aG9kcyB0cmlnZ2VyZWQgb24gX2NyZWF0ZSgpXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzID0gW107XG5cbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZlbnRFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbnByb3RvLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gYWRkIGlkIGZvciBGbGlja2l0eS5kYXRhXG4gIHZhciBpZCA9IHRoaXMuZ3VpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50LmZsaWNraXR5R1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcbiAgLy8gaW5pdGlhbCBwcm9wZXJ0aWVzXG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gIC8vIGhvdyBtYW55IGZyYW1lcyBzbGlkZXIgaGFzIGJlZW4gaW4gc2FtZSBwb3NpdGlvblxuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICAvLyBpbml0aWFsIHBoeXNpY3MgcHJvcGVydGllc1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgdGhpcy5vcmlnaW5TaWRlID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgLy8gY3JlYXRlIHZpZXdwb3J0ICYgc2xpZGVyXG4gIHRoaXMudmlld3BvcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGhpcy52aWV3cG9ydC5jbGFzc05hbWUgPSAnZmxpY2tpdHktdmlld3BvcnQnO1xuICB0aGlzLl9jcmVhdGVTbGlkZXIoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5yZXNpemUgfHwgdGhpcy5vcHRpb25zLndhdGNoQ1NTICkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB9XG5cbiAgLy8gYWRkIGxpc3RlbmVycyBmcm9tIG9uIG9wdGlvblxuICBmb3IgKCB2YXIgZXZlbnROYW1lIGluIHRoaXMub3B0aW9ucy5vbiApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLm9wdGlvbnMub25bIGV2ZW50TmFtZSBdO1xuICAgIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgfVxuXG4gIEZsaWNraXR5LmNyZWF0ZU1ldGhvZHMuZm9yRWFjaCggZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICB0aGlzWyBtZXRob2QgXSgpO1xuICB9LCB0aGlzICk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMud2F0Y2hDU1MgKSB7XG4gICAgdGhpcy53YXRjaENTUygpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG59O1xuXG4vKipcbiAqIHNldCBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gZXh0ZW5kXG4gKi9cbnByb3RvLm9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRzICkge1xuICB1dGlscy5leHRlbmQoIHRoaXMub3B0aW9ucywgb3B0cyApO1xufTtcblxucHJvdG8uYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZsaWNraXR5LWVuYWJsZWQnKTtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgKSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZsaWNraXR5LXJ0bCcpO1xuICB9XG5cbiAgdGhpcy5nZXRTaXplKCk7XG4gIC8vIG1vdmUgaW5pdGlhbCBjZWxsIGVsZW1lbnRzIHNvIHRoZXkgY2FuIGJlIGxvYWRlZCBhcyBjZWxsc1xuICB2YXIgY2VsbEVsZW1zID0gdGhpcy5fZmlsdGVyRmluZENlbGxFbGVtZW50cyggdGhpcy5lbGVtZW50LmNoaWxkcmVuICk7XG4gIG1vdmVFbGVtZW50cyggY2VsbEVsZW1zLCB0aGlzLnNsaWRlciApO1xuICB0aGlzLnZpZXdwb3J0LmFwcGVuZENoaWxkKCB0aGlzLnNsaWRlciApO1xuICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoIHRoaXMudmlld3BvcnQgKTtcbiAgLy8gZ2V0IGNlbGxzIGZyb20gY2hpbGRyZW5cbiAgdGhpcy5yZWxvYWRDZWxscygpO1xuXG4gIGlmICggdGhpcy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgKSB7XG4gICAgLy8gYWxsb3cgZWxlbWVudCB0byBmb2N1c2FibGVcbiAgICB0aGlzLmVsZW1lbnQudGFiSW5kZXggPSAwO1xuICAgIC8vIGxpc3RlbiBmb3Iga2V5IHByZXNzZXNcbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCB0aGlzICk7XG4gIH1cblxuICB0aGlzLmVtaXRFdmVudCgnYWN0aXZhdGUnKTtcbiAgdGhpcy5zZWxlY3RJbml0aWFsSW5kZXgoKTtcbiAgLy8gZmxhZyBmb3IgaW5pdGlhbCBhY3RpdmF0aW9uLCBmb3IgdXNpbmcgaW5pdGlhbEluZGV4XG4gIHRoaXMuaXNJbml0QWN0aXZhdGVkID0gdHJ1ZTtcbiAgLy8gcmVhZHkgZXZlbnQuICM0OTNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWFkeScpO1xufTtcblxuLy8gc2xpZGVyIHBvc2l0aW9ucyB0aGUgY2VsbHNcbnByb3RvLl9jcmVhdGVTbGlkZXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2xpZGVyIGVsZW1lbnQgZG9lcyBhbGwgdGhlIHBvc2l0aW9uaW5nXG4gIHZhciBzbGlkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2xpZGVyLmNsYXNzTmFtZSA9ICdmbGlja2l0eS1zbGlkZXInO1xuICBzbGlkZXIuc3R5bGVbIHRoaXMub3JpZ2luU2lkZSBdID0gMDtcbiAgdGhpcy5zbGlkZXIgPSBzbGlkZXI7XG59O1xuXG5wcm90by5fZmlsdGVyRmluZENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgcmV0dXJuIHV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyggZWxlbXMsIHRoaXMub3B0aW9ucy5jZWxsU2VsZWN0b3IgKTtcbn07XG5cbi8vIGdvZXMgdGhyb3VnaCBhbGwgY2hpbGRyZW5cbnByb3RvLnJlbG9hZENlbGxzID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICB0aGlzLmNlbGxzID0gdGhpcy5fbWFrZUNlbGxzKCB0aGlzLnNsaWRlci5jaGlsZHJlbiApO1xuICB0aGlzLnBvc2l0aW9uQ2VsbHMoKTtcbiAgdGhpcy5fZ2V0V3JhcFNoaWZ0Q2VsbHMoKTtcbiAgdGhpcy5zZXRHYWxsZXJ5U2l6ZSgpO1xufTtcblxuLyoqXG4gKiB0dXJuIGVsZW1lbnRzIGludG8gRmxpY2tpdHkuQ2VsbHNcbiAqIEBwYXJhbSB7W0FycmF5LCBOb2RlTGlzdCwgSFRNTEVsZW1lbnRdfSBlbGVtcyAtIGVsZW1lbnRzIHRvIG1ha2UgaW50byBjZWxsc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IEZsaWNraXR5IENlbGxzXG4gKi9cbnByb3RvLl9tYWtlQ2VsbHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBjZWxsRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kQ2VsbEVsZW1lbnRzKCBlbGVtcyApO1xuXG4gIC8vIGNyZWF0ZSBuZXcgRmxpY2tpdHkgZm9yIGNvbGxlY3Rpb25cbiAgdmFyIGNlbGxzID0gY2VsbEVsZW1zLm1hcCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHJldHVybiBuZXcgQ2VsbCggY2VsbEVsZW0sIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBjZWxscztcbn07XG5cbnByb3RvLmdldExhc3RDZWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzWyB0aGlzLmNlbGxzLmxlbmd0aCAtIDEgXTtcbn07XG5cbnByb3RvLmdldExhc3RTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkZXNbIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEgXTtcbn07XG5cbi8vIHBvc2l0aW9ucyBhbGwgY2VsbHNcbnByb3RvLnBvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2l6ZSBhbGwgY2VsbHNcbiAgdGhpcy5fc2l6ZUNlbGxzKCB0aGlzLmNlbGxzICk7XG4gIC8vIHBvc2l0aW9uIGFsbCBjZWxsc1xuICB0aGlzLl9wb3NpdGlvbkNlbGxzKCAwICk7XG59O1xuXG4vKipcbiAqIHBvc2l0aW9uIGNlcnRhaW4gY2VsbHNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSB3aGljaCBjZWxsIHRvIHN0YXJ0IHdpdGhcbiAqL1xucHJvdG8uX3Bvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbiggaW5kZXggKSB7XG4gIGluZGV4ID0gaW5kZXggfHwgMDtcbiAgLy8gYWxzbyBtZWFzdXJlIG1heENlbGxIZWlnaHRcbiAgLy8gc3RhcnQgMCBpZiBwb3NpdGlvbmluZyBhbGwgY2VsbHNcbiAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gaW5kZXggPyB0aGlzLm1heENlbGxIZWlnaHQgfHwgMCA6IDA7XG4gIHZhciBjZWxsWCA9IDA7XG4gIC8vIGdldCBjZWxsWFxuICBpZiAoIGluZGV4ID4gMCApIHtcbiAgICB2YXIgc3RhcnRDZWxsID0gdGhpcy5jZWxsc1sgaW5kZXggLSAxIF07XG4gICAgY2VsbFggPSBzdGFydENlbGwueCArIHN0YXJ0Q2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbiAgdmFyIGxlbiA9IHRoaXMuY2VsbHMubGVuZ3RoO1xuICBmb3IgKCB2YXIgaSA9IGluZGV4OyBpIDwgbGVuOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGNlbGwuc2V0UG9zaXRpb24oIGNlbGxYICk7XG4gICAgY2VsbFggKz0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gICAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gTWF0aC5tYXgoIGNlbGwuc2l6ZS5vdXRlckhlaWdodCwgdGhpcy5tYXhDZWxsSGVpZ2h0ICk7XG4gIH1cbiAgLy8ga2VlcCB0cmFjayBvZiBjZWxsWCBmb3Igd3JhcC1hcm91bmRcbiAgdGhpcy5zbGlkZWFibGVXaWR0aCA9IGNlbGxYO1xuICAvLyBzbGlkZXNcbiAgdGhpcy51cGRhdGVTbGlkZXMoKTtcbiAgLy8gY29udGFpbiBzbGlkZXMgdGFyZ2V0XG4gIHRoaXMuX2NvbnRhaW5TbGlkZXMoKTtcbiAgLy8gdXBkYXRlIHNsaWRlc1dpZHRoXG4gIHRoaXMuc2xpZGVzV2lkdGggPSBsZW4gPyB0aGlzLmdldExhc3RTbGlkZSgpLnRhcmdldCAtIHRoaXMuc2xpZGVzWzBdLnRhcmdldCA6IDA7XG59O1xuXG4vKipcbiAqIGNlbGwuZ2V0U2l6ZSgpIG9uIG11bHRpcGxlIGNlbGxzXG4gKiBAcGFyYW0ge0FycmF5fSBjZWxscyAtIGNlbGxzIHRvIHNpemVcbiAqL1xucHJvdG8uX3NpemVDZWxscyA9IGZ1bmN0aW9uKCBjZWxscyApIHtcbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5nZXRTaXplKCk7XG4gIH0gKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by51cGRhdGVTbGlkZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNsaWRlID0gbmV3IFNsaWRlKCB0aGlzICk7XG4gIHRoaXMuc2xpZGVzLnB1c2goIHNsaWRlICk7XG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLm9yaWdpblNpZGUgPT0gJ2xlZnQnO1xuICB2YXIgbmV4dE1hcmdpbiA9IGlzT3JpZ2luTGVmdCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCc7XG5cbiAgdmFyIGNhbkNlbGxGaXQgPSB0aGlzLl9nZXRDYW5DZWxsRml0KCk7XG5cbiAgdGhpcy5jZWxscy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbCwgaSApIHtcbiAgICAvLyBqdXN0IGFkZCBjZWxsIGlmIGZpcnN0IGNlbGwgaW4gc2xpZGVcbiAgICBpZiAoICFzbGlkZS5jZWxscy5sZW5ndGggKSB7XG4gICAgICBzbGlkZS5hZGRDZWxsKCBjZWxsICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNsaWRlV2lkdGggPSAoIHNsaWRlLm91dGVyV2lkdGggLSBzbGlkZS5maXJzdE1hcmdpbiApICtcbiAgICAgICggY2VsbC5zaXplLm91dGVyV2lkdGggLSBjZWxsLnNpemVbIG5leHRNYXJnaW4gXSApO1xuXG4gICAgaWYgKCBjYW5DZWxsRml0LmNhbGwoIHRoaXMsIGksIHNsaWRlV2lkdGggKSApIHtcbiAgICAgIHNsaWRlLmFkZENlbGwoIGNlbGwgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9lc24ndCBmaXQsIG5ldyBzbGlkZVxuICAgICAgc2xpZGUudXBkYXRlVGFyZ2V0KCk7XG5cbiAgICAgIHNsaWRlID0gbmV3IFNsaWRlKCB0aGlzICk7XG4gICAgICB0aGlzLnNsaWRlcy5wdXNoKCBzbGlkZSApO1xuICAgICAgc2xpZGUuYWRkQ2VsbCggY2VsbCApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xuICAvLyBsYXN0IHNsaWRlXG4gIHNsaWRlLnVwZGF0ZVRhcmdldCgpO1xuICAvLyB1cGRhdGUgLnNlbGVjdGVkU2xpZGVcbiAgdGhpcy51cGRhdGVTZWxlY3RlZFNsaWRlKCk7XG59O1xuXG5wcm90by5fZ2V0Q2FuQ2VsbEZpdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZ3JvdXBDZWxscyA9IHRoaXMub3B0aW9ucy5ncm91cENlbGxzO1xuICBpZiAoICFncm91cENlbGxzICkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgZ3JvdXBDZWxscyA9PSAnbnVtYmVyJyApIHtcbiAgICAvLyBncm91cCBieSBudW1iZXIuIDMgLT4gWzAsMSwyXSwgWzMsNCw1XSwgLi4uXG4gICAgdmFyIG51bWJlciA9IHBhcnNlSW50KCBncm91cENlbGxzLCAxMCApO1xuICAgIHJldHVybiBmdW5jdGlvbiggaSApIHtcbiAgICAgIHJldHVybiAoIGkgJSBudW1iZXIgKSAhPT0gMDtcbiAgICB9O1xuICB9XG4gIC8vIGRlZmF1bHQsIGdyb3VwIGJ5IHdpZHRoIG9mIHNsaWRlXG4gIC8vIHBhcnNlICc3NSVcbiAgdmFyIHBlcmNlbnRNYXRjaCA9IHR5cGVvZiBncm91cENlbGxzID09ICdzdHJpbmcnICYmXG4gICAgZ3JvdXBDZWxscy5tYXRjaCggL14oXFxkKyklJC8gKTtcbiAgdmFyIHBlcmNlbnQgPSBwZXJjZW50TWF0Y2ggPyBwYXJzZUludCggcGVyY2VudE1hdGNoWzFdLCAxMCApIC8gMTAwIDogMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCBpLCBzbGlkZVdpZHRoICkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXMgKi9cbiAgICByZXR1cm4gc2xpZGVXaWR0aCA8PSAoIHRoaXMuc2l6ZS5pbm5lcldpZHRoICsgMSApICogcGVyY2VudDtcbiAgfTtcbn07XG5cbi8vIGFsaWFzIF9pbml0IGZvciBqUXVlcnkgcGx1Z2luIC5mbGlja2l0eSgpXG5wcm90by5faW5pdCA9XG5wcm90by5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucG9zaXRpb25DZWxscygpO1xuICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbiAgdGhpcy5zZXRDZWxsQWxpZ24oKTtcbiAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoICogdGhpcy5jZWxsQWxpZ247XG59O1xuXG52YXIgY2VsbEFsaWduU2hvcnRoYW5kcyA9IHtcbiAgLy8gY2VsbCBhbGlnbiwgdGhlbiBiYXNlZCBvbiBvcmlnaW4gc2lkZVxuICBjZW50ZXI6IHtcbiAgICBsZWZ0OiAwLjUsXG4gICAgcmlnaHQ6IDAuNSxcbiAgfSxcbiAgbGVmdDoge1xuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDEsXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMSxcbiAgfSxcbn07XG5cbnByb3RvLnNldENlbGxBbGlnbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2hvcnRoYW5kID0gY2VsbEFsaWduU2hvcnRoYW5kc1sgdGhpcy5vcHRpb25zLmNlbGxBbGlnbiBdO1xuICB0aGlzLmNlbGxBbGlnbiA9IHNob3J0aGFuZCA/IHNob3J0aGFuZFsgdGhpcy5vcmlnaW5TaWRlIF0gOiB0aGlzLm9wdGlvbnMuY2VsbEFsaWduO1xufTtcblxucHJvdG8uc2V0R2FsbGVyeVNpemUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuc2V0R2FsbGVyeVNpemUgKSB7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCAmJiB0aGlzLnNlbGVjdGVkU2xpZGUgP1xuICAgICAgdGhpcy5zZWxlY3RlZFNsaWRlLmhlaWdodCA6IHRoaXMubWF4Q2VsbEhlaWdodDtcbiAgICB0aGlzLnZpZXdwb3J0LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbn07XG5cbnByb3RvLl9nZXRXcmFwU2hpZnRDZWxscyA9IGZ1bmN0aW9uKCkge1xuICAvLyBvbmx5IGZvciB3cmFwLWFyb3VuZFxuICBpZiAoICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdW5zaGlmdCBwcmV2aW91cyBjZWxsc1xuICB0aGlzLl91bnNoaWZ0Q2VsbHMoIHRoaXMuYmVmb3JlU2hpZnRDZWxscyApO1xuICB0aGlzLl91bnNoaWZ0Q2VsbHMoIHRoaXMuYWZ0ZXJTaGlmdENlbGxzICk7XG4gIC8vIGdldCBiZWZvcmUgY2VsbHNcbiAgLy8gaW5pdGlhbCBnYXBcbiAgdmFyIGdhcFggPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICB2YXIgY2VsbEluZGV4ID0gdGhpcy5jZWxscy5sZW5ndGggLSAxO1xuICB0aGlzLmJlZm9yZVNoaWZ0Q2VsbHMgPSB0aGlzLl9nZXRHYXBDZWxscyggZ2FwWCwgY2VsbEluZGV4LCAtMSApO1xuICAvLyBnZXQgYWZ0ZXIgY2VsbHNcbiAgLy8gZW5kaW5nIGdhcCBiZXR3ZWVuIGxhc3QgY2VsbCBhbmQgZW5kIG9mIGdhbGxlcnkgdmlld3BvcnRcbiAgZ2FwWCA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoIC0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgLy8gc3RhcnQgY2xvbmluZyBhdCBmaXJzdCBjZWxsLCB3b3JraW5nIGZvcndhcmRzXG4gIHRoaXMuYWZ0ZXJTaGlmdENlbGxzID0gdGhpcy5fZ2V0R2FwQ2VsbHMoIGdhcFgsIDAsIDEgKTtcbn07XG5cbnByb3RvLl9nZXRHYXBDZWxscyA9IGZ1bmN0aW9uKCBnYXBYLCBjZWxsSW5kZXgsIGluY3JlbWVudCApIHtcbiAgLy8ga2VlcCBhZGRpbmcgY2VsbHMgdW50aWwgdGhlIGNvdmVyIHRoZSBpbml0aWFsIGdhcFxuICB2YXIgY2VsbHMgPSBbXTtcbiAgd2hpbGUgKCBnYXBYID4gMCApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbIGNlbGxJbmRleCBdO1xuICAgIGlmICggIWNlbGwgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2VsbHMucHVzaCggY2VsbCApO1xuICAgIGNlbGxJbmRleCArPSBpbmNyZW1lbnQ7XG4gICAgZ2FwWCAtPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgfVxuICByZXR1cm4gY2VsbHM7XG59O1xuXG4vLyAtLS0tLSBjb250YWluIC0tLS0tIC8vXG5cbi8vIGNvbnRhaW4gY2VsbCB0YXJnZXRzIHNvIG5vIGV4Y2VzcyBzbGlkaW5nXG5wcm90by5fY29udGFpblNsaWRlcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMuY29udGFpbiB8fCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCB8fCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpc1JpZ2h0VG9MZWZ0ID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0O1xuICB2YXIgYmVnaW5NYXJnaW4gPSBpc1JpZ2h0VG9MZWZ0ID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcbiAgdmFyIGVuZE1hcmdpbiA9IGlzUmlnaHRUb0xlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICB2YXIgY29udGVudFdpZHRoID0gdGhpcy5zbGlkZWFibGVXaWR0aCAtIHRoaXMuZ2V0TGFzdENlbGwoKS5zaXplWyBlbmRNYXJnaW4gXTtcbiAgLy8gY29udGVudCBpcyBsZXNzIHRoYW4gZ2FsbGVyeSBzaXplXG4gIHZhciBpc0NvbnRlbnRTbWFsbGVyID0gY29udGVudFdpZHRoIDwgdGhpcy5zaXplLmlubmVyV2lkdGg7XG4gIC8vIGJvdW5kc1xuICB2YXIgYmVnaW5Cb3VuZCA9IHRoaXMuY3Vyc29yUG9zaXRpb24gKyB0aGlzLmNlbGxzWzBdLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIHZhciBlbmRCb3VuZCA9IGNvbnRlbnRXaWR0aCAtIHRoaXMuc2l6ZS5pbm5lcldpZHRoICogKCAxIC0gdGhpcy5jZWxsQWxpZ24gKTtcbiAgLy8gY29udGFpbiBlYWNoIGNlbGwgdGFyZ2V0XG4gIHRoaXMuc2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHtcbiAgICBpZiAoIGlzQ29udGVudFNtYWxsZXIgKSB7XG4gICAgICAvLyBhbGwgY2VsbHMgZml0IGluc2lkZSBnYWxsZXJ5XG4gICAgICBzbGlkZS50YXJnZXQgPSBjb250ZW50V2lkdGggKiB0aGlzLmNlbGxBbGlnbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29udGFpbiB0byBib3VuZHNcbiAgICAgIHNsaWRlLnRhcmdldCA9IE1hdGgubWF4KCBzbGlkZS50YXJnZXQsIGJlZ2luQm91bmQgKTtcbiAgICAgIHNsaWRlLnRhcmdldCA9IE1hdGgubWluKCBzbGlkZS50YXJnZXQsIGVuZEJvdW5kICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuLyoqXG4gKiBlbWl0cyBldmVudHMgdmlhIGV2ZW50RW1pdHRlciBhbmQgalF1ZXJ5IGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIG9yaWdpbmFsIGV2ZW50XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gZXh0cmEgYXJndW1lbnRzXG4gKi9cbnByb3RvLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGFyZ3MgKSB7XG4gIHZhciBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG5cbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICAvLyBkZWZhdWx0IHRyaWdnZXIgd2l0aCB0eXBlIGlmIG5vIGV2ZW50XG4gICAgdHlwZSArPSB0aGlzLm9wdGlvbnMubmFtZXNwYWNlSlF1ZXJ5RXZlbnRzID8gJy5mbGlja2l0eScgOiAnJztcbiAgICB2YXIgJGV2ZW50ID0gdHlwZTtcbiAgICBpZiAoIGV2ZW50ICkge1xuICAgICAgLy8gY3JlYXRlIGpRdWVyeSBldmVudFxuICAgICAgdmFyIGpRRXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgalFFdmVudC50eXBlID0gdHlwZTtcbiAgICAgICRldmVudCA9IGpRRXZlbnQ7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlbGVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgc2xpZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXcmFwIC0gd2lsbCB3cmFwLWFyb3VuZCB0byBsYXN0L2ZpcnN0IGlmIGF0IHRoZSBlbmRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gd2lsbCBpbW1lZGlhdGVseSBzZXQgcG9zaXRpb24gYXQgc2VsZWN0ZWQgY2VsbFxuICovXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbiggaW5kZXgsIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICBpZiAoICF0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbmRleCA9IHBhcnNlSW50KCBpbmRleCwgMTAgKTtcbiAgdGhpcy5fd3JhcFNlbGVjdCggaW5kZXggKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kIHx8IGlzV3JhcCApIHtcbiAgICBpbmRleCA9IHV0aWxzLm1vZHVsbyggaW5kZXgsIHRoaXMuc2xpZGVzLmxlbmd0aCApO1xuICB9XG4gIC8vIGJhaWwgaWYgaW52YWxpZCBpbmRleFxuICBpZiAoICF0aGlzLnNsaWRlc1sgaW5kZXggXSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHByZXZJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gIHRoaXMudXBkYXRlU2VsZWN0ZWRTbGlkZSgpO1xuICBpZiAoIGlzSW5zdGFudCApIHtcbiAgICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCApIHtcbiAgICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIH1cbiAgLy8gZXZlbnRzXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3NlbGVjdCcsIG51bGwsIFsgaW5kZXggXSApO1xuICAvLyBjaGFuZ2UgZXZlbnQgaWYgbmV3IGluZGV4XG4gIGlmICggaW5kZXggIT0gcHJldkluZGV4ICkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2NoYW5nZScsIG51bGwsIFsgaW5kZXggXSApO1xuICB9XG4gIC8vIG9sZCB2MSBldmVudCBuYW1lLCByZW1vdmUgaW4gdjNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjZWxsU2VsZWN0Jyk7XG59O1xuXG4vLyB3cmFwcyBwb3NpdGlvbiBmb3Igd3JhcEFyb3VuZCwgdG8gbW92ZSB0byBjbG9zZXN0IHNsaWRlLiAjMTEzXG5wcm90by5fd3JhcFNlbGVjdCA9IGZ1bmN0aW9uKCBpbmRleCApIHtcbiAgdmFyIGxlbiA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgdmFyIGlzV3JhcHBpbmcgPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiBsZW4gPiAxO1xuICBpZiAoICFpc1dyYXBwaW5nICkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICB2YXIgd3JhcEluZGV4ID0gdXRpbHMubW9kdWxvKCBpbmRleCwgbGVuICk7XG4gIC8vIGdvIHRvIHNob3J0ZXN0XG4gIHZhciBkZWx0YSA9IE1hdGguYWJzKCB3cmFwSW5kZXggLSB0aGlzLnNlbGVjdGVkSW5kZXggKTtcbiAgdmFyIGJhY2tXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggKyBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICB2YXIgZm9yZXdhcmRXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggLSBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICBpZiAoICF0aGlzLmlzRHJhZ1NlbGVjdCAmJiBiYWNrV3JhcERlbHRhIDwgZGVsdGEgKSB7XG4gICAgaW5kZXggKz0gbGVuO1xuICB9IGVsc2UgaWYgKCAhdGhpcy5pc0RyYWdTZWxlY3QgJiYgZm9yZXdhcmRXcmFwRGVsdGEgPCBkZWx0YSApIHtcbiAgICBpbmRleCAtPSBsZW47XG4gIH1cbiAgLy8gd3JhcCBwb3NpdGlvbiBzbyBzbGlkZXIgaXMgd2l0aGluIG5vcm1hbCBhcmVhXG4gIGlmICggaW5kZXggPCAwICkge1xuICAgIHRoaXMueCAtPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9IGVsc2UgaWYgKCBpbmRleCA+PSBsZW4gKSB7XG4gICAgdGhpcy54ICs9IHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLnByZXZpb3VzID0gZnVuY3Rpb24oIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICB0aGlzLnNlbGVjdCggdGhpcy5zZWxlY3RlZEluZGV4IC0gMSwgaXNXcmFwLCBpc0luc3RhbnQgKTtcbn07XG5cbnByb3RvLm5leHQgPSBmdW5jdGlvbiggaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXggKyAxLCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8udXBkYXRlU2VsZWN0ZWRTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgdGhpcy5zZWxlY3RlZEluZGV4IF07XG4gIC8vIHNlbGVjdGVkSW5kZXggY291bGQgYmUgb3V0c2lkZSBvZiBzbGlkZXMsIGlmIHRyaWdnZXJlZCBiZWZvcmUgcmVzaXplKClcbiAgaWYgKCAhc2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGVkIHNsaWRlXG4gIHRoaXMudW5zZWxlY3RTZWxlY3RlZFNsaWRlKCk7XG4gIC8vIHVwZGF0ZSBuZXcgc2VsZWN0ZWQgc2xpZGVcbiAgdGhpcy5zZWxlY3RlZFNsaWRlID0gc2xpZGU7XG4gIHNsaWRlLnNlbGVjdCgpO1xuICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBzbGlkZS5jZWxscztcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gc2xpZGUuZ2V0Q2VsbEVsZW1lbnRzKCk7XG4gIC8vIEhBQ0s6IHNlbGVjdGVkQ2VsbCAmIHNlbGVjdGVkRWxlbWVudCBpcyBmaXJzdCBjZWxsIGluIHNsaWRlLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAvLyBSZW1vdmUgaW4gdjM/XG4gIHRoaXMuc2VsZWN0ZWRDZWxsID0gc2xpZGUuY2VsbHNbMF07XG4gIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xufTtcblxucHJvdG8udW5zZWxlY3RTZWxlY3RlZFNsaWRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5zZWxlY3RlZFNsaWRlICkge1xuICAgIHRoaXMuc2VsZWN0ZWRTbGlkZS51bnNlbGVjdCgpO1xuICB9XG59O1xuXG5wcm90by5zZWxlY3RJbml0aWFsSW5kZXggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMub3B0aW9ucy5pbml0aWFsSW5kZXg7XG4gIC8vIGFscmVhZHkgYWN0aXZhdGVkLCBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWRJbmRleFxuICBpZiAoIHRoaXMuaXNJbml0QWN0aXZhdGVkICkge1xuICAgIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXgsIGZhbHNlLCB0cnVlICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHNlbGVjdCB3aXRoIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0eXBlb2YgaW5pdGlhbEluZGV4ID09ICdzdHJpbmcnICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5xdWVyeUNlbGwoIGluaXRpYWxJbmRleCApO1xuICAgIGlmICggY2VsbCApIHtcbiAgICAgIHRoaXMuc2VsZWN0Q2VsbCggaW5pdGlhbEluZGV4LCBmYWxzZSwgdHJ1ZSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIHNlbGVjdCB3aXRoIG51bWJlclxuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0aGlzLnNsaWRlc1sgaW5pdGlhbEluZGV4IF0gKSB7XG4gICAgaW5kZXggPSBpbml0aWFsSW5kZXg7XG4gIH1cbiAgLy8gc2VsZWN0IGluc3RhbnRseVxuICB0aGlzLnNlbGVjdCggaW5kZXgsIGZhbHNlLCB0cnVlICk7XG59O1xuXG4vKipcbiAqIHNlbGVjdCBzbGlkZSBmcm9tIG51bWJlciBvciBjZWxsIGVsZW1lbnRcbiAqIEBwYXJhbSB7W0VsZW1lbnQsIE51bWJlcl19IHZhbHVlIC0gemVyby1iYXNlZCBpbmRleCBvciBlbGVtZW50IHRvIHNlbGVjdFxuICogQHBhcmFtIHtCb29sZWFufSBpc1dyYXAgLSBlbmFibGVzIHdyYXBwaW5nIGFyb3VuZCBmb3IgZXh0cmEgaW5kZXhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gZGlzYWJsZXMgc2xpZGUgYW5pbWF0aW9uXG4gKi9cbnByb3RvLnNlbGVjdENlbGwgPSBmdW5jdGlvbiggdmFsdWUsIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICAvLyBnZXQgY2VsbFxuICB2YXIgY2VsbCA9IHRoaXMucXVlcnlDZWxsKCB2YWx1ZSApO1xuICBpZiAoICFjZWxsICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHRoaXMuZ2V0Q2VsbFNsaWRlSW5kZXgoIGNlbGwgKTtcbiAgdGhpcy5zZWxlY3QoIGluZGV4LCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8uZ2V0Q2VsbFNsaWRlSW5kZXggPSBmdW5jdGlvbiggY2VsbCApIHtcbiAgLy8gZ2V0IGluZGV4IG9mIHNsaWRlcyB0aGF0IGhhcyBjZWxsXG4gIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuc2xpZGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2ldO1xuICAgIHZhciBpbmRleCA9IHNsaWRlLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXQgY2VsbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgRmxpY2tpdHkuQ2VsbCwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtIC0gbWF0Y2hpbmcgY2VsbCBlbGVtZW50XG4gKiBAcmV0dXJucyB7RmxpY2tpdHkuQ2VsbH0gY2VsbCAtIG1hdGNoaW5nIGNlbGxcbiAqL1xucHJvdG8uZ2V0Q2VsbCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBsb29wIHRocm91Z2ggY2VsbHMgdG8gZ2V0IHRoZSBvbmUgdGhhdCBtYXRjaGVzXG4gIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGlmICggY2VsbC5lbGVtZW50ID09IGVsZW0gKSB7XG4gICAgICByZXR1cm4gY2VsbDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgRmxpY2tpdHkuQ2VsbHMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge1tFbGVtZW50LCBBcnJheSwgTm9kZUxpc3RdfSBlbGVtcyAtIG11bHRpcGxlIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7QXJyYXl9IGNlbGxzIC0gRmxpY2tpdHkuQ2VsbHNcbiAqL1xucHJvdG8uZ2V0Q2VsbHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgY2VsbHMgPSBbXTtcbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmdldENlbGwoIGVsZW0gKTtcbiAgICBpZiAoIGNlbGwgKSB7XG4gICAgICBjZWxscy5wdXNoKCBjZWxsICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG4gIHJldHVybiBjZWxscztcbn07XG5cbi8qKlxuICogZ2V0IGNlbGwgZWxlbWVudHNcbiAqIEByZXR1cm5zIHtBcnJheX0gY2VsbEVsZW1zXG4gKi9cbnByb3RvLmdldENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jZWxscy5tYXAoIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIHJldHVybiBjZWxsLmVsZW1lbnQ7XG4gIH0gKTtcbn07XG5cbi8qKlxuICogZ2V0IHBhcmVudCBjZWxsIGZyb20gYW4gZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtIC0gY2hpbGQgZWxlbWVudFxuICogQHJldHVybnMge0ZsaWNraXQuQ2VsbH0gY2VsbCAtIHBhcmVudCBjZWxsXG4gKi9cbnByb3RvLmdldFBhcmVudENlbGwgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gZmlyc3QgY2hlY2sgaWYgZWxlbSBpcyBjZWxsXG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gIGlmICggY2VsbCApIHtcbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuICAvLyB0cnkgdG8gZ2V0IHBhcmVudCBjZWxsIGVsZW1cbiAgZWxlbSA9IHV0aWxzLmdldFBhcmVudCggZWxlbSwgJy5mbGlja2l0eS1zbGlkZXIgPiAqJyApO1xuICByZXR1cm4gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG59O1xuXG4vKipcbiAqIGdldCBjZWxscyBhZGphY2VudCB0byBhIHNsaWRlXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGFkakNvdW50IC0gbnVtYmVyIG9mIGFkamFjZW50IHNsaWRlc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCAtIGluZGV4IG9mIHNsaWRlIHRvIHN0YXJ0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGNlbGxzIC0gYXJyYXkgb2YgRmxpY2tpdHkuQ2VsbHNcbiAqL1xucHJvdG8uZ2V0QWRqYWNlbnRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbiggYWRqQ291bnQsIGluZGV4ICkge1xuICBpZiAoICFhZGpDb3VudCApIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNsaWRlLmdldENlbGxFbGVtZW50cygpO1xuICB9XG4gIGluZGV4ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuc2VsZWN0ZWRJbmRleCA6IGluZGV4O1xuXG4gIHZhciBsZW4gPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gIGlmICggMSArICggYWRqQ291bnQgKiAyICkgPj0gbGVuICkge1xuICAgIHJldHVybiB0aGlzLmdldENlbGxFbGVtZW50cygpO1xuICB9XG5cbiAgdmFyIGNlbGxFbGVtcyA9IFtdO1xuICBmb3IgKCB2YXIgaSA9IGluZGV4IC0gYWRqQ291bnQ7IGkgPD0gaW5kZXggKyBhZGpDb3VudDsgaSsrICkge1xuICAgIHZhciBzbGlkZUluZGV4ID0gdGhpcy5vcHRpb25zLndyYXBBcm91bmQgPyB1dGlscy5tb2R1bG8oIGksIGxlbiApIDogaTtcbiAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgc2xpZGVJbmRleCBdO1xuICAgIGlmICggc2xpZGUgKSB7XG4gICAgICBjZWxsRWxlbXMgPSBjZWxsRWxlbXMuY29uY2F0KCBzbGlkZS5nZXRDZWxsRWxlbWVudHMoKSApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2VsbEVsZW1zO1xufTtcblxuLyoqXG4gKiBzZWxlY3Qgc2xpZGUgZnJvbSBudW1iZXIgb3IgY2VsbCBlbGVtZW50XG4gKiBAcGFyYW0ge1tFbGVtZW50LCBTdHJpbmcsIE51bWJlcl19IHNlbGVjdG9yIC0gZWxlbWVudCwgc2VsZWN0b3Igc3RyaW5nLCBvciBpbmRleFxuICogQHJldHVybnMge0ZsaWNraXR5LkNlbGx9IC0gbWF0Y2hpbmcgY2VsbFxuICovXG5wcm90by5xdWVyeUNlbGwgPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG4gIGlmICggdHlwZW9mIHNlbGVjdG9yID09ICdudW1iZXInICkge1xuICAgIC8vIHVzZSBudW1iZXIgYXMgaW5kZXhcbiAgICByZXR1cm4gdGhpcy5jZWxsc1sgc2VsZWN0b3IgXTtcbiAgfVxuICBpZiAoIHR5cGVvZiBzZWxlY3RvciA9PSAnc3RyaW5nJyApIHtcbiAgICAvLyBkbyBub3Qgc2VsZWN0IGludmFsaWQgc2VsZWN0b3JzIGZyb20gaGFzaDogIzEyMywgIy8uICM3OTFcbiAgICBpZiAoIHNlbGVjdG9yLm1hdGNoKCAvXlsjLl0/W1xcZC9dLyApICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB1c2Ugc3RyaW5nIGFzIHNlbGVjdG9yLCBnZXQgZWxlbWVudFxuICAgIHNlbGVjdG9yID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gIH1cbiAgLy8gZ2V0IGNlbGwgZnJvbSBlbGVtZW50XG4gIHJldHVybiB0aGlzLmdldENlbGwoIHNlbGVjdG9yICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBldmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8udWlDaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0RXZlbnQoJ3VpQ2hhbmdlJyk7XG59O1xuXG4vLyBrZWVwIGZvY3VzIG9uIGVsZW1lbnQgd2hlbiBjaGlsZCBVSSBlbGVtZW50cyBhcmUgY2xpY2tlZFxucHJvdG8uY2hpbGRVSVBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBIQUNLIGlPUyBkb2VzIG5vdCBhbGxvdyB0b3VjaCBldmVudHMgdG8gYnViYmxlIHVwPyFcbiAgaWYgKCBldmVudC50eXBlICE9ICd0b3VjaHN0YXJ0JyApIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIHRoaXMuZm9jdXMoKTtcbn07XG5cbi8vIC0tLS0tIHJlc2l6ZSAtLS0tLSAvL1xuXG5wcm90by5vbnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLndhdGNoQ1NTKCk7XG4gIHRoaXMucmVzaXplKCk7XG59O1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCggRmxpY2tpdHksICdvbnJlc2l6ZScsIDE1MCApO1xuXG5wcm90by5yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgLy8gIzExNzcgZGlzYWJsZSByZXNpemUgYmVoYXZpb3Igd2hlbiBhbmltYXRpbmcgb3IgZHJhZ2dpbmcgZm9yIGlPUyAxNVxuICBpZiAoICF0aGlzLmlzQWN0aXZlIHx8IHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmdldFNpemUoKTtcbiAgLy8gd3JhcCB2YWx1ZXNcbiAgaWYgKCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICB0aGlzLnggPSB1dGlscy5tb2R1bG8oIHRoaXMueCwgdGhpcy5zbGlkZWFibGVXaWR0aCApO1xuICB9XG4gIHRoaXMucG9zaXRpb25DZWxscygpO1xuICB0aGlzLl9nZXRXcmFwU2hpZnRDZWxscygpO1xuICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIHRoaXMuZW1pdEV2ZW50KCdyZXNpemUnKTtcbiAgLy8gdXBkYXRlIHNlbGVjdGVkIGluZGV4IGZvciBncm91cCBzbGlkZXMsIGluc3RhbnRcbiAgLy8gVE9ETzogcG9zaXRpb24gY2FuIGJlIGxvc3QgYmV0d2VlbiBncm91cHMgb2YgdmFyaW91cyBudW1iZXJzXG4gIHZhciBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xuICB0aGlzLnNlbGVjdENlbGwoIHNlbGVjdGVkRWxlbWVudCwgZmFsc2UsIHRydWUgKTtcbn07XG5cbi8vIHdhdGNoZXMgdGhlIDphZnRlciBwcm9wZXJ0eSwgYWN0aXZhdGVzL2RlYWN0aXZhdGVzXG5wcm90by53YXRjaENTUyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd2F0Y2hPcHRpb24gPSB0aGlzLm9wdGlvbnMud2F0Y2hDU1M7XG4gIGlmICggIXdhdGNoT3B0aW9uICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhZnRlckNvbnRlbnQgPSBnZXRDb21wdXRlZFN0eWxlKCB0aGlzLmVsZW1lbnQsICc6YWZ0ZXInICkuY29udGVudDtcbiAgLy8gYWN0aXZhdGUgaWYgOmFmdGVyIHsgY29udGVudDogJ2ZsaWNraXR5JyB9XG4gIGlmICggYWZ0ZXJDb250ZW50LmluZGV4T2YoJ2ZsaWNraXR5JykgIT0gLTEgKSB7XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBrZXlkb3duIC0tLS0tIC8vXG5cbi8vIGdvIHByZXZpb3VzL25leHQgaWYgbGVmdC9yaWdodCBrZXlzIHByZXNzZWRcbnByb3RvLm9ua2V5ZG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gb25seSB3b3JrIGlmIGVsZW1lbnQgaXMgaW4gZm9jdXNcbiAgdmFyIGlzTm90Rm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSB0aGlzLmVsZW1lbnQ7XG4gIGlmICggIXRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5IHx8IGlzTm90Rm9jdXNlZCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IEZsaWNraXR5LmtleWJvYXJkSGFuZGxlcnNbIGV2ZW50LmtleUNvZGUgXTtcbiAgaWYgKCBoYW5kbGVyICkge1xuICAgIGhhbmRsZXIuY2FsbCggdGhpcyApO1xuICB9XG59O1xuXG5GbGlja2l0eS5rZXlib2FyZEhhbmRsZXJzID0ge1xuICAvLyBsZWZ0IGFycm93XG4gIDM3OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVmdE1ldGhvZCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/ICduZXh0JyA6ICdwcmV2aW91cyc7XG4gICAgdGhpcy51aUNoYW5nZSgpO1xuICAgIHRoaXNbIGxlZnRNZXRob2QgXSgpO1xuICB9LFxuICAvLyByaWdodCBhcnJvd1xuICAzOTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJpZ2h0TWV0aG9kID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ3ByZXZpb3VzJyA6ICduZXh0JztcbiAgICB0aGlzLnVpQ2hhbmdlKCk7XG4gICAgdGhpc1sgcmlnaHRNZXRob2QgXSgpO1xuICB9LFxufTtcblxuLy8gLS0tLS0gZm9jdXMgLS0tLS0gLy9cblxucHJvdG8uZm9jdXMgPSBmdW5jdGlvbigpIHtcbiAgLy8gVE9ETyByZW1vdmUgc2Nyb2xsVG8gb25jZSBmb2N1cyBvcHRpb25zIGdldHMgbW9yZSBzdXBwb3J0XG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1cyAuLi5cbiAgLy8gICAgI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICB2YXIgcHJldlNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gIHRoaXMuZWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIC8vIGhhY2sgdG8gZml4IHNjcm9sbCBqdW1wIGFmdGVyIGZvY3VzLCAjNzZcbiAgaWYgKCB3aW5kb3cucGFnZVlPZmZzZXQgIT0gcHJldlNjcm9sbFkgKSB7XG4gICAgd2luZG93LnNjcm9sbFRvKCB3aW5kb3cucGFnZVhPZmZzZXQsIHByZXZTY3JvbGxZICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlc3Ryb3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZGVhY3RpdmF0ZSBhbGwgRmxpY2tpdHkgZnVuY3Rpb25hbGl0eSwgYnV0IGtlZXAgc3R1ZmYgYXZhaWxhYmxlXG5wcm90by5kZWFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNBY3RpdmUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmbGlja2l0eS1lbmFibGVkJyk7XG4gIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmbGlja2l0eS1ydGwnKTtcbiAgdGhpcy51bnNlbGVjdFNlbGVjdGVkU2xpZGUoKTtcbiAgLy8gZGVzdHJveSBjZWxsc1xuICB0aGlzLmNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGNlbGwuZGVzdHJveSgpO1xuICB9ICk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy52aWV3cG9ydCApO1xuICAvLyBtb3ZlIGNoaWxkIGVsZW1lbnRzIGJhY2sgaW50byBlbGVtZW50XG4gIG1vdmVFbGVtZW50cyggdGhpcy5zbGlkZXIuY2hpbGRyZW4sIHRoaXMuZWxlbWVudCApO1xuICBpZiAoIHRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ICkge1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgdGhpcyApO1xuICB9XG4gIC8vIHNldCBmbGFnc1xuICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gIHRoaXMuZW1pdEV2ZW50KCdkZWFjdGl2YXRlJyk7XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5hbGxPZmYoKTtcbiAgdGhpcy5lbWl0RXZlbnQoJ2Rlc3Ryb3knKTtcbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCAnZmxpY2tpdHknICk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQ7XG4gIGRlbGV0ZSBpbnN0YW5jZXNbIHRoaXMuZ3VpZCBdO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvdG90eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggcHJvdG8sIGFuaW1hdGVQcm90b3R5cGUgKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXh0cmFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0IEZsaWNraXR5IGluc3RhbmNlIGZyb20gZWxlbWVudFxuICogQHBhcmFtIHtbRWxlbWVudCwgU3RyaW5nXX0gZWxlbSAtIGVsZW1lbnQgb3Igc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyB7RmxpY2tpdHl9IC0gRmxpY2tpdHkgaW5zdGFuY2VcbiAqL1xuRmxpY2tpdHkuZGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBlbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtICk7XG4gIHZhciBpZCA9IGVsZW0gJiYgZWxlbS5mbGlja2l0eUdVSUQ7XG4gIHJldHVybiBpZCAmJiBpbnN0YW5jZXNbIGlkIF07XG59O1xuXG51dGlscy5odG1sSW5pdCggRmxpY2tpdHksICdmbGlja2l0eScgKTtcblxuaWYgKCBqUXVlcnkgJiYgalF1ZXJ5LmJyaWRnZXQgKSB7XG4gIGpRdWVyeS5icmlkZ2V0KCAnZmxpY2tpdHknLCBGbGlja2l0eSApO1xufVxuXG4vLyBzZXQgaW50ZXJuYWwgalF1ZXJ5LCBmb3IgV2VicGFjayArIGpRdWVyeSB2MywgIzQ3OFxuRmxpY2tpdHkuc2V0SlF1ZXJ5ID0gZnVuY3Rpb24oIGpxICkge1xuICBqUXVlcnkgPSBqcTtcbn07XG5cbkZsaWNraXR5LkNlbGwgPSBDZWxsO1xuRmxpY2tpdHkuU2xpZGUgPSBTbGlkZTtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIgdW5pcG9pbnRlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8qIVxuICogVW5pcG9pbnRlciB2Mi40LjBcbiAqIGJhc2UgY2xhc3MgZm9yIGRvaW5nIG9uZSB0aGluZyB3aXRoIHBvaW50ZXIgZXZlbnRcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFsIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgZXZFbWl0dGVyXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5Vbmlwb2ludGVyID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXJcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIgKSB7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBVbmlwb2ludGVyKCkge31cblxuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnZhciBwcm90byA9IFVuaXBvaW50ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG5wcm90by5iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB0aGlzLl9iaW5kU3RhcnRFdmVudCggZWxlbSwgdHJ1ZSApO1xufTtcblxucHJvdG8udW5iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB0aGlzLl9iaW5kU3RhcnRFdmVudCggZWxlbSwgZmFsc2UgKTtcbn07XG5cbi8qKlxuICogQWRkIG9yIHJlbW92ZSBzdGFydCBldmVudFxuICogQHBhcmFtIHtCb29sZWFufSBpc0FkZCAtIHJlbW92ZSBpZiBmYWxzZXlcbiAqL1xucHJvdG8uX2JpbmRTdGFydEV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIGlzQWRkICkge1xuICAvLyBtdW5nZSBpc0FkZCwgZGVmYXVsdCB0byB0cnVlXG4gIGlzQWRkID0gaXNBZGQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBpc0FkZDtcbiAgdmFyIGJpbmRNZXRob2QgPSBpc0FkZCA/ICdhZGRFdmVudExpc3RlbmVyJyA6ICdyZW1vdmVFdmVudExpc3RlbmVyJztcblxuICAvLyBkZWZhdWx0IHRvIG1vdXNlIGV2ZW50c1xuICB2YXIgc3RhcnRFdmVudCA9ICdtb3VzZWRvd24nO1xuICBpZiAoICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyApIHtcbiAgICAvLyBIQUNLIHByZWZlciBUb3VjaCBFdmVudHMgYXMgeW91IGNhbiBwcmV2ZW50RGVmYXVsdCBvbiB0b3VjaHN0YXJ0IHRvXG4gICAgLy8gZGlzYWJsZSBzY3JvbGwgaW4gaU9TICYgbW9iaWxlIENocm9tZSBtZXRhZml6enkvZmxpY2tpdHkjMTE3N1xuICAgIHN0YXJ0RXZlbnQgPSAndG91Y2hzdGFydCc7XG4gIH0gZWxzZSBpZiAoIHdpbmRvdy5Qb2ludGVyRXZlbnQgKSB7XG4gICAgLy8gUG9pbnRlciBFdmVudHNcbiAgICBzdGFydEV2ZW50ID0gJ3BvaW50ZXJkb3duJztcbiAgfVxuICBlbGVtWyBiaW5kTWV0aG9kIF0oIHN0YXJ0RXZlbnQsIHRoaXMgKTtcbn07XG5cbi8vIHRyaWdnZXIgaGFuZGxlciBtZXRob2RzIGZvciBldmVudHNcbnByb3RvLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbi8vIHJldHVybnMgdGhlIHRvdWNoIHRoYXQgd2UncmUga2VlcGluZyB0cmFjayBvZlxucHJvdG8uZ2V0VG91Y2ggPSBmdW5jdGlvbiggdG91Y2hlcyApIHtcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcbiAgICBpZiAoIHRvdWNoLmlkZW50aWZpZXIgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICAgIHJldHVybiB0b3VjaDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIC0tLS0tIHN0YXJ0IGV2ZW50IC0tLS0tIC8vXG5cbnByb3RvLm9ubW91c2Vkb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBkaXNtaXNzIGNsaWNrcyBmcm9tIHJpZ2h0IG9yIG1pZGRsZSBidXR0b25zXG4gIHZhciBidXR0b24gPSBldmVudC5idXR0b247XG4gIGlmICggYnV0dG9uICYmICggYnV0dG9uICE9PSAwICYmIGJ1dHRvbiAhPT0gMSApICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9wb2ludGVyRG93biggZXZlbnQsIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbnRvdWNoc3RhcnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gKTtcbn07XG5cbnByb3RvLm9ucG9pbnRlcmRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbi8qKlxuICogcG9pbnRlciBzdGFydFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqL1xucHJvdG8uX3BvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBkaXNtaXNzIHJpZ2h0IGNsaWNrIGFuZCBvdGhlciBwb2ludGVyc1xuICAvLyBidXR0b24gPSAwIGlzIG9rYXksIDEtNCBub3RcbiAgaWYgKCBldmVudC5idXR0b24gfHwgdGhpcy5pc1BvaW50ZXJEb3duICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuaXNQb2ludGVyRG93biA9IHRydWU7XG4gIC8vIHNhdmUgcG9pbnRlciBpZGVudGlmaWVyIHRvIG1hdGNoIHVwIHRvdWNoIGV2ZW50c1xuICB0aGlzLnBvaW50ZXJJZGVudGlmaWVyID0gcG9pbnRlci5wb2ludGVySWQgIT09IHVuZGVmaW5lZCA/XG4gICAgLy8gcG9pbnRlcklkIGZvciBwb2ludGVyIGV2ZW50cywgdG91Y2guaW5kZW50aWZpZXIgZm9yIHRvdWNoIGV2ZW50c1xuICAgIHBvaW50ZXIucG9pbnRlcklkIDogcG9pbnRlci5pZGVudGlmaWVyO1xuXG4gIHRoaXMucG9pbnRlckRvd24oIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5wb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5fYmluZFBvc3RTdGFydEV2ZW50cyggZXZlbnQgKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyRG93bicsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gaGFzaCBvZiBldmVudHMgdG8gYmUgYm91bmQgYWZ0ZXIgc3RhcnQgZXZlbnRcbnZhciBwb3N0U3RhcnRFdmVudHMgPSB7XG4gIG1vdXNlZG93bjogWyAnbW91c2Vtb3ZlJywgJ21vdXNldXAnIF0sXG4gIHRvdWNoc3RhcnQ6IFsgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcgXSxcbiAgcG9pbnRlcmRvd246IFsgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJ1cCcsICdwb2ludGVyY2FuY2VsJyBdLFxufTtcblxucHJvdG8uX2JpbmRQb3N0U3RhcnRFdmVudHMgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggIWV2ZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBnZXQgcHJvcGVyIGV2ZW50cyB0byBtYXRjaCBzdGFydCBldmVudFxuICB2YXIgZXZlbnRzID0gcG9zdFN0YXJ0RXZlbnRzWyBldmVudC50eXBlIF07XG4gIC8vIGJpbmQgZXZlbnRzIHRvIG5vZGVcbiAgZXZlbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudE5hbWUgKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgdGhpcyApO1xuICB9LCB0aGlzICk7XG4gIC8vIHNhdmUgdGhlc2UgYXJndW1lbnRzXG4gIHRoaXMuX2JvdW5kUG9pbnRlckV2ZW50cyA9IGV2ZW50cztcbn07XG5cbnByb3RvLl91bmJpbmRQb3N0U3RhcnRFdmVudHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgZm9yIF9ib3VuZEV2ZW50cywgaW4gY2FzZSBkcmFnRW5kIHRyaWdnZXJlZCB0d2ljZSAob2xkIElFOCBidWcpXG4gIGlmICggIXRoaXMuX2JvdW5kUG9pbnRlckV2ZW50cyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudE5hbWUgKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgdGhpcyApO1xuICB9LCB0aGlzICk7XG5cbiAgZGVsZXRlIHRoaXMuX2JvdW5kUG9pbnRlckV2ZW50cztcbn07XG5cbi8vIC0tLS0tIG1vdmUgZXZlbnQgLS0tLS0gLy9cblxucHJvdG8ub25tb3VzZW1vdmUgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJNb3ZlKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbnByb3RvLm9ucG9pbnRlcm1vdmUgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQucG9pbnRlcklkID09IHRoaXMucG9pbnRlcklkZW50aWZpZXIgKSB7XG4gICAgdGhpcy5fcG9pbnRlck1vdmUoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNobW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRvdWNoID0gdGhpcy5nZXRUb3VjaCggZXZlbnQuY2hhbmdlZFRvdWNoZXMgKTtcbiAgaWYgKCB0b3VjaCApIHtcbiAgICB0aGlzLl9wb2ludGVyTW92ZSggZXZlbnQsIHRvdWNoICk7XG4gIH1cbn07XG5cbi8qKlxuICogcG9pbnRlciBtb3ZlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICogQHByaXZhdGVcbiAqL1xucHJvdG8uX3BvaW50ZXJNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLnBvaW50ZXJNb3ZlKCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gcHVibGljXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyTW92ZScsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gZW5kIGV2ZW50IC0tLS0tIC8vXG5cblxucHJvdG8ub25tb3VzZXVwID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCBldmVudCApO1xufTtcblxucHJvdG8ub25wb2ludGVydXAgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQucG9pbnRlcklkID09IHRoaXMucG9pbnRlcklkZW50aWZpZXIgKSB7XG4gICAgdGhpcy5fcG9pbnRlclVwKCBldmVudCwgZXZlbnQgKTtcbiAgfVxufTtcblxucHJvdG8ub250b3VjaGVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRvdWNoID0gdGhpcy5nZXRUb3VjaCggZXZlbnQuY2hhbmdlZFRvdWNoZXMgKTtcbiAgaWYgKCB0b3VjaCApIHtcbiAgICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCB0b3VjaCApO1xuICB9XG59O1xuXG4vKipcbiAqIHBvaW50ZXIgdXBcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fcG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9wb2ludGVyRG9uZSgpO1xuICB0aGlzLnBvaW50ZXJVcCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbi8vIHB1YmxpY1xucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJVcCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gcG9pbnRlciBkb25lIC0tLS0tIC8vXG5cbi8vIHRyaWdnZXJlZCBvbiBwb2ludGVyIHVwICYgcG9pbnRlciBjYW5jZWxcbnByb3RvLl9wb2ludGVyRG9uZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9wb2ludGVyUmVzZXQoKTtcbiAgdGhpcy5fdW5iaW5kUG9zdFN0YXJ0RXZlbnRzKCk7XG4gIHRoaXMucG9pbnRlckRvbmUoKTtcbn07XG5cbnByb3RvLl9wb2ludGVyUmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVzZXQgcHJvcGVydGllc1xuICB0aGlzLmlzUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgZGVsZXRlIHRoaXMucG9pbnRlcklkZW50aWZpZXI7XG59O1xuXG5wcm90by5wb2ludGVyRG9uZSA9IG5vb3A7XG5cbi8vIC0tLS0tIHBvaW50ZXIgY2FuY2VsIC0tLS0tIC8vXG5cbnByb3RvLm9ucG9pbnRlcmNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyQ2FuY2VsKCBldmVudCwgZXZlbnQgKTtcbiAgfVxufTtcblxucHJvdG8ub250b3VjaGNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRvdWNoID0gdGhpcy5nZXRUb3VjaCggZXZlbnQuY2hhbmdlZFRvdWNoZXMgKTtcbiAgaWYgKCB0b3VjaCApIHtcbiAgICB0aGlzLl9wb2ludGVyQ2FuY2VsKCBldmVudCwgdG91Y2ggKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwb2ludGVyIGNhbmNlbFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9wb2ludGVyQ2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9wb2ludGVyRG9uZSgpO1xuICB0aGlzLnBvaW50ZXJDYW5jZWwoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG4vLyBwdWJsaWNcbnByb3RvLnBvaW50ZXJDYW5jZWwgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlckNhbmNlbCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbi8vIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgeC95IGNvb3JkcyBmcm9tIGV2ZW50XG5Vbmlwb2ludGVyLmdldFBvaW50ZXJQb2ludCA9IGZ1bmN0aW9uKCBwb2ludGVyICkge1xuICByZXR1cm4ge1xuICAgIHg6IHBvaW50ZXIucGFnZVgsXG4gICAgeTogcG9pbnRlci5wYWdlWVxuICB9O1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBVbmlwb2ludGVyO1xuXG59KSk7XG59KTtcblxudmFyIHVuaWRyYWdnZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKiFcbiAqIFVuaWRyYWdnZXIgdjIuNC4wXG4gKiBEcmFnZ2FibGUgYmFzZSBjbGFzc1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHVuaXBvaW50ZXJcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LlVuaWRyYWdnZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LlVuaXBvaW50ZXJcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBVbmlwb2ludGVyICkge1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVbmlkcmFnZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIFVuaWRyYWdnZXIoKSB7fVxuXG4vLyBpbmhlcml0IFVuaXBvaW50ZXIgJiBFdkVtaXR0ZXJcbnZhciBwcm90byA9IFVuaWRyYWdnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVW5pcG9pbnRlci5wcm90b3R5cGUgKTtcblxuLy8gLS0tLS0gYmluZCBzdGFydCAtLS0tLSAvL1xuXG5wcm90by5iaW5kSGFuZGxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9iaW5kSGFuZGxlcyggdHJ1ZSApO1xufTtcblxucHJvdG8udW5iaW5kSGFuZGxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9iaW5kSGFuZGxlcyggZmFsc2UgKTtcbn07XG5cbi8qKlxuICogQWRkIG9yIHJlbW92ZSBzdGFydCBldmVudFxuICogQHBhcmFtIHtCb29sZWFufSBpc0FkZFxuICovXG5wcm90by5fYmluZEhhbmRsZXMgPSBmdW5jdGlvbiggaXNBZGQgKSB7XG4gIC8vIG11bmdlIGlzQWRkLCBkZWZhdWx0IHRvIHRydWVcbiAgaXNBZGQgPSBpc0FkZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGlzQWRkO1xuICAvLyBiaW5kIGVhY2ggaGFuZGxlXG4gIHZhciBiaW5kTWV0aG9kID0gaXNBZGQgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG4gIHZhciB0b3VjaEFjdGlvbiA9IGlzQWRkID8gdGhpcy5fdG91Y2hBY3Rpb25WYWx1ZSA6ICcnO1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5oYW5kbGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBoYW5kbGUgPSB0aGlzLmhhbmRsZXNbaV07XG4gICAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGhhbmRsZSwgaXNBZGQgKTtcbiAgICBoYW5kbGVbIGJpbmRNZXRob2QgXSggJ2NsaWNrJywgdGhpcyApO1xuICAgIC8vIHRvdWNoLWFjdGlvbjogbm9uZSB0byBvdmVycmlkZSBicm93c2VyIHRvdWNoIGdlc3R1cmVzLiBtZXRhZml6enkvZmxpY2tpdHkjNTQwXG4gICAgaWYgKCB3aW5kb3cuUG9pbnRlckV2ZW50ICkge1xuICAgICAgaGFuZGxlLnN0eWxlLnRvdWNoQWN0aW9uID0gdG91Y2hBY3Rpb247XG4gICAgfVxuICB9XG59O1xuXG4vLyBwcm90b3R5cGUgc28gaXQgY2FuIGJlIG92ZXJ3cml0ZWFibGUgYnkgRmxpY2tpdHlcbnByb3RvLl90b3VjaEFjdGlvblZhbHVlID0gJ25vbmUnO1xuXG4vLyAtLS0tLSBzdGFydCBldmVudCAtLS0tLSAvL1xuXG4vKipcbiAqIHBvaW50ZXIgc3RhcnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKi9cbnByb3RvLnBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdHJhY2sgc3RhcnQgZXZlbnQgcG9zaXRpb25cbiAgLy8gU2FmYXJpIDkgb3ZlcnJpZGVzIHBhZ2VYIGFuZCBwYWdlWS4gVGhlc2UgdmFsdWVzIG5lZWRzIHRvIGJlIGNvcGllZC4gZmxpY2tpdHkjODQyXG4gIHRoaXMucG9pbnRlckRvd25Qb2ludGVyID0ge1xuICAgIHBhZ2VYOiBwb2ludGVyLnBhZ2VYLFxuICAgIHBhZ2VZOiBwb2ludGVyLnBhZ2VZLFxuICB9O1xuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMucG9pbnRlckRvd25CbHVyKCk7XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJEb3duJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBub2RlcyB0aGF0IGhhdmUgdGV4dCBmaWVsZHNcbnZhciBjdXJzb3JOb2RlcyA9IHtcbiAgVEVYVEFSRUE6IHRydWUsXG4gIElOUFVUOiB0cnVlLFxuICBTRUxFQ1Q6IHRydWUsXG4gIE9QVElPTjogdHJ1ZSxcbn07XG5cbi8vIGlucHV0IHR5cGVzIHRoYXQgZG8gbm90IGhhdmUgdGV4dCBmaWVsZHNcbnZhciBjbGlja1R5cGVzID0ge1xuICByYWRpbzogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGJ1dHRvbjogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgZmlsZTogdHJ1ZSxcbn07XG5cbi8vIGRpc21pc3MgaW5wdXRzIHdpdGggdGV4dCBmaWVsZHMuIGZsaWNraXR5IzQwMywgZmxpY2tpdHkjNDA0XG5wcm90by5va2F5UG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc0N1cnNvck5vZGUgPSBjdXJzb3JOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIHZhciBpc0NsaWNrVHlwZSA9IGNsaWNrVHlwZXNbIGV2ZW50LnRhcmdldC50eXBlIF07XG4gIHZhciBpc09rYXkgPSAhaXNDdXJzb3JOb2RlIHx8IGlzQ2xpY2tUeXBlO1xuICBpZiAoICFpc09rYXkgKSB7XG4gICAgdGhpcy5fcG9pbnRlclJlc2V0KCk7XG4gIH1cbiAgcmV0dXJuIGlzT2theTtcbn07XG5cbi8vIGtsdWRnZSB0byBibHVyIHByZXZpb3VzbHkgZm9jdXNlZCBpbnB1dFxucHJvdG8ucG9pbnRlckRvd25CbHVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgLy8gZG8gbm90IGJsdXIgYm9keSBmb3IgSUUxMCwgbWV0YWZpenp5L2ZsaWNraXR5IzExN1xuICB2YXIgY2FuQmx1ciA9IGZvY3VzZWQgJiYgZm9jdXNlZC5ibHVyICYmIGZvY3VzZWQgIT0gZG9jdW1lbnQuYm9keTtcbiAgaWYgKCBjYW5CbHVyICkge1xuICAgIGZvY3VzZWQuYmx1cigpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBtb3ZlIGV2ZW50IC0tLS0tIC8vXG5cbi8qKlxuICogZHJhZyBtb3ZlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlck1vdmUnLCBbIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbiAgdGhpcy5fZHJhZ01vdmUoIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICk7XG59O1xuXG4vLyBiYXNlIHBvaW50ZXIgbW92ZSBsb2dpY1xucHJvdG8uX2RyYWdQb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB7XG4gICAgeDogcG9pbnRlci5wYWdlWCAtIHRoaXMucG9pbnRlckRvd25Qb2ludGVyLnBhZ2VYLFxuICAgIHk6IHBvaW50ZXIucGFnZVkgLSB0aGlzLnBvaW50ZXJEb3duUG9pbnRlci5wYWdlWVxuICB9O1xuICAvLyBzdGFydCBkcmFnIGlmIHBvaW50ZXIgaGFzIG1vdmVkIGZhciBlbm91Z2ggdG8gc3RhcnQgZHJhZ1xuICBpZiAoICF0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5oYXNEcmFnU3RhcnRlZCggbW92ZVZlY3RvciApICkge1xuICAgIHRoaXMuX2RyYWdTdGFydCggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfVxuICByZXR1cm4gbW92ZVZlY3Rvcjtcbn07XG5cbi8vIGNvbmRpdGlvbiBpZiBwb2ludGVyIGhhcyBtb3ZlZCBmYXIgZW5vdWdoIHRvIHN0YXJ0IGRyYWdcbnByb3RvLmhhc0RyYWdTdGFydGVkID0gZnVuY3Rpb24oIG1vdmVWZWN0b3IgKSB7XG4gIHJldHVybiBNYXRoLmFicyggbW92ZVZlY3Rvci54ICkgPiAzIHx8IE1hdGguYWJzKCBtb3ZlVmVjdG9yLnkgKSA+IDM7XG59O1xuXG4vLyAtLS0tLSBlbmQgZXZlbnQgLS0tLS0gLy9cblxuLyoqXG4gKiBwb2ludGVyIHVwXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlclVwJywgWyBldmVudCwgcG9pbnRlciBdICk7XG4gIHRoaXMuX2RyYWdQb2ludGVyVXAoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5fZHJhZ1BvaW50ZXJVcCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCB0aGlzLmlzRHJhZ2dpbmcgKSB7XG4gICAgdGhpcy5fZHJhZ0VuZCggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBwb2ludGVyIGRpZG4ndCBtb3ZlIGVub3VnaCBmb3IgZHJhZyB0byBzdGFydFxuICAgIHRoaXMuX3N0YXRpY0NsaWNrKCBldmVudCwgcG9pbnRlciApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkcmFnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGRyYWdTdGFydFxucHJvdG8uX2RyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgLy8gcHJldmVudCBjbGlja3NcbiAgdGhpcy5pc1ByZXZlbnRpbmdDbGlja3MgPSB0cnVlO1xuICB0aGlzLmRyYWdTdGFydCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnU3RhcnQnLCBbIGV2ZW50LCBwb2ludGVyIF0gKTtcbn07XG5cbi8vIGRyYWdNb3ZlXG5wcm90by5fZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIC8vIGRvIG5vdCBkcmFnIGlmIG5vdCBkcmFnZ2luZyB5ZXRcbiAgaWYgKCAhdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZHJhZ01vdmUoIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICk7XG59O1xuXG5wcm90by5kcmFnTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnTW92ZScsIFsgZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgXSApO1xufTtcblxuLy8gZHJhZ0VuZFxucHJvdG8uX2RyYWdFbmQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHNldCBmbGFnc1xuICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgLy8gcmUtZW5hYmxlIGNsaWNraW5nIGFzeW5jXG4gIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzLmlzUHJldmVudGluZ0NsaWNrcztcbiAgfS5iaW5kKCB0aGlzICkgKTtcblxuICB0aGlzLmRyYWdFbmQoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ2RyYWdFbmQnLCBbIGV2ZW50LCBwb2ludGVyIF0gKTtcbn07XG5cbi8vIC0tLS0tIG9uY2xpY2sgLS0tLS0gLy9cblxuLy8gaGFuZGxlIGFsbCBjbGlja3MgYW5kIHByZXZlbnQgY2xpY2tzIHdoZW4gZHJhZ2dpbmdcbnByb3RvLm9uY2xpY2sgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggdGhpcy5pc1ByZXZlbnRpbmdDbGlja3MgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gc3RhdGljQ2xpY2sgLS0tLS0gLy9cblxuLy8gdHJpZ2dlcmVkIGFmdGVyIHBvaW50ZXIgZG93biAmIHVwIHdpdGggbm8vdGlueSBtb3ZlbWVudFxucHJvdG8uX3N0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBpZ25vcmUgZW11bGF0ZWQgbW91c2UgdXAgY2xpY2tzXG4gIGlmICggdGhpcy5pc0lnbm9yaW5nTW91c2VVcCAmJiBldmVudC50eXBlID09ICdtb3VzZXVwJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YXRpY0NsaWNrKCBldmVudCwgcG9pbnRlciApO1xuXG4gIC8vIHNldCBmbGFnIGZvciBlbXVsYXRlZCBjbGlja3MgMzAwbXMgYWZ0ZXIgdG91Y2hlbmRcbiAgaWYgKCBldmVudC50eXBlICE9ICdtb3VzZXVwJyApIHtcbiAgICB0aGlzLmlzSWdub3JpbmdNb3VzZVVwID0gdHJ1ZTtcbiAgICAvLyByZXNldCBmbGFnIGFmdGVyIDMwMG1zXG4gICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICBkZWxldGUgdGhpcy5pc0lnbm9yaW5nTW91c2VVcDtcbiAgICB9LmJpbmQoIHRoaXMgKSwgNDAwICk7XG4gIH1cbn07XG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3N0YXRpY0NsaWNrJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSB1dGlscyAtLS0tLSAvL1xuXG5VbmlkcmFnZ2VyLmdldFBvaW50ZXJQb2ludCA9IFVuaXBvaW50ZXIuZ2V0UG9pbnRlclBvaW50O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIFVuaWRyYWdnZXI7XG5cbn0pKTtcbn0pO1xuXG52YXIgZHJhZyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIGRyYWdcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICB1bmlkcmFnZ2VyLFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuRmxpY2tpdHkgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgICAgd2luZG93LlVuaWRyYWdnZXIsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pZHJhZ2dlciwgdXRpbHMgKSB7XG5cbi8vIC0tLS0tIGRlZmF1bHRzIC0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgZHJhZ2dhYmxlOiAnPjEnLFxuICBkcmFnVGhyZXNob2xkOiAzLFxufSApO1xuXG4vLyAtLS0tLSBjcmVhdGUgLS0tLS0gLy9cblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlRHJhZycpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkcmFnIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG51dGlscy5leHRlbmQoIHByb3RvLCBVbmlkcmFnZ2VyLnByb3RvdHlwZSApO1xucHJvdG8uX3RvdWNoQWN0aW9uVmFsdWUgPSAncGFuLXknO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8uX2NyZWF0ZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5vbkFjdGl2YXRlRHJhZyApO1xuICB0aGlzLm9uKCAndWlDaGFuZ2UnLCB0aGlzLl91aUNoYW5nZURyYWcgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLm9uRGVhY3RpdmF0ZURyYWcgKTtcbiAgdGhpcy5vbiggJ2NlbGxDaGFuZ2UnLCB0aGlzLnVwZGF0ZURyYWdnYWJsZSApO1xuICAvLyBUT0RPIHVwZGF0ZURyYWdnYWJsZSBvbiByZXNpemU/IGlmIGdyb3VwQ2VsbHMgJiBzbGlkZXMgY2hhbmdlXG59O1xuXG5wcm90by5vbkFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmhhbmRsZXMgPSBbIHRoaXMudmlld3BvcnQgXTtcbiAgdGhpcy5iaW5kSGFuZGxlcygpO1xuICB0aGlzLnVwZGF0ZURyYWdnYWJsZSgpO1xufTtcblxucHJvdG8ub25EZWFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnVuYmluZEhhbmRsZXMoKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xufTtcblxucHJvdG8udXBkYXRlRHJhZ2dhYmxlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRpc2FibGUgZHJhZ2dpbmcgaWYgbGVzcyB0aGFuIDIgc2xpZGVzLiAjMjc4XG4gIGlmICggdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9PSAnPjEnICkge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLnNsaWRlcy5sZW5ndGggPiAxO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlO1xuICB9XG4gIGlmICggdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtZHJhZ2dhYmxlJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xuICB9XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxucHJvdG8uYmluZERyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9IHRydWU7XG4gIHRoaXMudXBkYXRlRHJhZ2dhYmxlKCk7XG59O1xuXG5wcm90by51bmJpbmREcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVEcmFnZ2FibGUoKTtcbn07XG5cbnByb3RvLl91aUNoYW5nZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcG9pbnRlciBldmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9wb2ludGVyRG93blByZXZlbnREZWZhdWx0KCBldmVudCApO1xuICB0aGlzLnBvaW50ZXJEb3duRm9jdXMoIGV2ZW50ICk7XG4gIC8vIGJsdXJcbiAgaWYgKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZWxlbWVudCApIHtcbiAgICAvLyBkbyBub3QgYmx1ciBpZiBhbHJlYWR5IGZvY3VzZWRcbiAgICB0aGlzLnBvaW50ZXJEb3duQmx1cigpO1xuICB9XG5cbiAgLy8gc3RvcCBpZiBpdCB3YXMgbW92aW5nXG4gIHRoaXMuZHJhZ1ggPSB0aGlzLng7XG4gIHRoaXMudmlld3BvcnQuY2xhc3NMaXN0LmFkZCgnaXMtcG9pbnRlci1kb3duJyk7XG4gIC8vIHRyYWNrIHNjcm9sbGluZ1xuICB0aGlzLnBvaW50ZXJEb3duU2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCB0aGlzICk7XG5cbiAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gZGVmYXVsdCBwb2ludGVyRG93biBsb2dpYywgdXNlZCBmb3Igc3RhdGljQ2xpY2tcbnByb3RvLl9wb2ludGVyRG93bkRlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHRyYWNrIHN0YXJ0IGV2ZW50IHBvc2l0aW9uXG4gIC8vIFNhZmFyaSA5IG92ZXJyaWRlcyBwYWdlWCBhbmQgcGFnZVkuIFRoZXNlIHZhbHVlcyBuZWVkcyB0byBiZSBjb3BpZWQuICM3NzlcbiAgdGhpcy5wb2ludGVyRG93blBvaW50ZXIgPSB7XG4gICAgcGFnZVg6IHBvaW50ZXIucGFnZVgsXG4gICAgcGFnZVk6IHBvaW50ZXIucGFnZVksXG4gIH07XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyRG93bicsIGV2ZW50LCBbIHBvaW50ZXIgXSApO1xufTtcblxudmFyIGZvY3VzTm9kZXMgPSB7XG4gIElOUFVUOiB0cnVlLFxuICBURVhUQVJFQTogdHJ1ZSxcbiAgU0VMRUNUOiB0cnVlLFxufTtcblxucHJvdG8ucG9pbnRlckRvd25Gb2N1cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzRm9jdXNOb2RlICkge1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxufTtcblxucHJvdG8uX3BvaW50ZXJEb3duUHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc1RvdWNoU3RhcnQgPSBldmVudC50eXBlID09ICd0b3VjaHN0YXJ0JztcbiAgdmFyIGlzVG91Y2hQb2ludGVyID0gZXZlbnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJztcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzVG91Y2hTdGFydCAmJiAhaXNUb3VjaFBvaW50ZXIgJiYgIWlzRm9jdXNOb2RlICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIG1vdmUgLS0tLS0gLy9cblxucHJvdG8uaGFzRHJhZ1N0YXJ0ZWQgPSBmdW5jdGlvbiggbW92ZVZlY3RvciApIHtcbiAgcmV0dXJuIE1hdGguYWJzKCBtb3ZlVmVjdG9yLnggKSA+IHRoaXMub3B0aW9ucy5kcmFnVGhyZXNob2xkO1xufTtcblxuLy8gLS0tLS0gdXAgLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBkZWxldGUgdGhpcy5pc1RvdWNoU2Nyb2xsaW5nO1xuICB0aGlzLnZpZXdwb3J0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLXBvaW50ZXItZG93bicpO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyVXAnLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbiAgdGhpcy5fZHJhZ1BvaW50ZXJVcCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgdGhpcyApO1xuICBkZWxldGUgdGhpcy5wb2ludGVyRG93blNjcm9sbDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRyYWdnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCAhdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiA9IHRoaXMueDtcbiAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsIHRoaXMgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnZHJhZ1N0YXJ0JywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3BvaW50ZXJNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG4gIHRoaXMuX2RyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxucHJvdG8uZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgdGhpcy5wcmV2aW91c0RyYWdYID0gdGhpcy5kcmFnWDtcbiAgLy8gcmV2ZXJzZSBpZiByaWdodC10by1sZWZ0XG4gIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAtMSA6IDE7XG4gIGlmICggdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gd3JhcCBhcm91bmQgbW92ZS4gIzU4OVxuICAgIG1vdmVWZWN0b3IueCAlPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9XG4gIHZhciBkcmFnWCA9IHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKyBtb3ZlVmVjdG9yLnggKiBkaXJlY3Rpb247XG5cbiAgaWYgKCAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgdGhpcy5zbGlkZXMubGVuZ3RoICkge1xuICAgIC8vIHNsb3cgZHJhZ1xuICAgIHZhciBvcmlnaW5Cb3VuZCA9IE1hdGgubWF4KCAtdGhpcy5zbGlkZXNbMF0udGFyZ2V0LCB0aGlzLmRyYWdTdGFydFBvc2l0aW9uICk7XG4gICAgZHJhZ1ggPSBkcmFnWCA+IG9yaWdpbkJvdW5kID8gKCBkcmFnWCArIG9yaWdpbkJvdW5kICkgKiAwLjUgOiBkcmFnWDtcbiAgICB2YXIgZW5kQm91bmQgPSBNYXRoLm1pbiggLXRoaXMuZ2V0TGFzdFNsaWRlKCkudGFyZ2V0LCB0aGlzLmRyYWdTdGFydFBvc2l0aW9uICk7XG4gICAgZHJhZ1ggPSBkcmFnWCA8IGVuZEJvdW5kID8gKCBkcmFnWCArIGVuZEJvdW5kICkgKiAwLjUgOiBkcmFnWDtcbiAgfVxuXG4gIHRoaXMuZHJhZ1ggPSBkcmFnWDtcblxuICB0aGlzLmRyYWdNb3ZlVGltZSA9IG5ldyBEYXRlKCk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2RyYWdNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG59O1xuXG5wcm90by5kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICkge1xuICAgIHRoaXMuaXNGcmVlU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgfVxuICAvLyBzZXQgc2VsZWN0ZWRJbmRleCBiYXNlZCBvbiB3aGVyZSBmbGljayB3aWxsIGVuZCB1cFxuICB2YXIgaW5kZXggPSB0aGlzLmRyYWdFbmRSZXN0aW5nU2VsZWN0KCk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMuZnJlZVNjcm9sbCAmJiAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gaWYgZnJlZS1zY3JvbGwgJiBub3Qgd3JhcCBhcm91bmRcbiAgICAvLyBkbyBub3QgZnJlZS1zY3JvbGwgaWYgZ29pbmcgb3V0c2lkZSBvZiBib3VuZGluZyBzbGlkZXNcbiAgICAvLyBzbyBib3VuZGluZyBzbGlkZXMgY2FuIGF0dHJhY3Qgc2xpZGVyLCBhbmQga2VlcCBpdCBpbiBib3VuZHNcbiAgICB2YXIgcmVzdGluZ1ggPSB0aGlzLmdldFJlc3RpbmdQb3NpdGlvbigpO1xuICAgIHRoaXMuaXNGcmVlU2Nyb2xsaW5nID0gLXJlc3RpbmdYID4gdGhpcy5zbGlkZXNbMF0udGFyZ2V0ICYmXG4gICAgICAtcmVzdGluZ1ggPCB0aGlzLmdldExhc3RTbGlkZSgpLnRhcmdldDtcbiAgfSBlbHNlIGlmICggIXRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICYmIGluZGV4ID09IHRoaXMuc2VsZWN0ZWRJbmRleCApIHtcbiAgICAvLyBib29zdCBzZWxlY3Rpb24gaWYgc2VsZWN0ZWQgaW5kZXggaGFzIG5vdCBjaGFuZ2VkXG4gICAgaW5kZXggKz0gdGhpcy5kcmFnRW5kQm9vc3RTZWxlY3QoKTtcbiAgfVxuICBkZWxldGUgdGhpcy5wcmV2aW91c0RyYWdYO1xuICAvLyBhcHBseSBzZWxlY3Rpb25cbiAgLy8gVE9ETyByZWZhY3RvciB0aGlzLCBzZWxlY3RpbmcgaGVyZSBmZWVscyB3ZWlyZFxuICAvLyBIQUNLLCBzZXQgZmxhZyBzbyBkcmFnZ2luZyBzdGF5cyBpbiBjb3JyZWN0IGRpcmVjdGlvblxuICB0aGlzLmlzRHJhZ1NlbGVjdCA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kO1xuICB0aGlzLnNlbGVjdCggaW5kZXggKTtcbiAgZGVsZXRlIHRoaXMuaXNEcmFnU2VsZWN0O1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdkcmFnRW5kJywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5kcmFnRW5kUmVzdGluZ1NlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzdGluZ1ggPSB0aGlzLmdldFJlc3RpbmdQb3NpdGlvbigpO1xuICAvLyBob3cgZmFyIGF3YXkgZnJvbSBzZWxlY3RlZCBzbGlkZVxuICB2YXIgZGlzdGFuY2UgPSBNYXRoLmFicyggdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIHRoaXMuc2VsZWN0ZWRJbmRleCApICk7XG4gIC8vIGdldCBjbG9zZXQgcmVzdGluZyBnb2luZyB1cCBhbmQgZ29pbmcgZG93blxuICB2YXIgcG9zaXRpdmVSZXN0aW5nID0gdGhpcy5fZ2V0Q2xvc2VzdFJlc3RpbmcoIHJlc3RpbmdYLCBkaXN0YW5jZSwgMSApO1xuICB2YXIgbmVnYXRpdmVSZXN0aW5nID0gdGhpcy5fZ2V0Q2xvc2VzdFJlc3RpbmcoIHJlc3RpbmdYLCBkaXN0YW5jZSwgLTEgKTtcbiAgLy8gdXNlIGNsb3NlciByZXN0aW5nIGZvciB3cmFwLWFyb3VuZFxuICB2YXIgaW5kZXggPSBwb3NpdGl2ZVJlc3RpbmcuZGlzdGFuY2UgPCBuZWdhdGl2ZVJlc3RpbmcuZGlzdGFuY2UgP1xuICAgIHBvc2l0aXZlUmVzdGluZy5pbmRleCA6IG5lZ2F0aXZlUmVzdGluZy5pbmRleDtcbiAgcmV0dXJuIGluZGV4O1xufTtcblxuLyoqXG4gKiBnaXZlbiByZXN0aW5nIFggYW5kIGRpc3RhbmNlIHRvIHNlbGVjdGVkIGNlbGxcbiAqIGdldCB0aGUgZGlzdGFuY2UgYW5kIGluZGV4IG9mIHRoZSBjbG9zZXN0IGNlbGxcbiAqIEBwYXJhbSB7TnVtYmVyfSByZXN0aW5nWCAtIGVzdGltYXRlZCBwb3N0LWZsaWNrIHJlc3RpbmcgcG9zaXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBkaXN0YW5jZSAtIGRpc3RhbmNlIHRvIHNlbGVjdGVkIGNlbGxcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5jcmVtZW50IC0gKzEgb3IgLTEsIGdvaW5nIHVwIG9yIGRvd25cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0geyBkaXN0YW5jZToge051bWJlcn0sIGluZGV4OiB7SW50ZWdlcn0gfVxuICovXG5wcm90by5fZ2V0Q2xvc2VzdFJlc3RpbmcgPSBmdW5jdGlvbiggcmVzdGluZ1gsIGRpc3RhbmNlLCBpbmNyZW1lbnQgKSB7XG4gIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gIHZhciBjb25kaXRpb24gPSB0aGlzLm9wdGlvbnMuY29udGFpbiAmJiAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgP1xuICAgIC8vIGlmIGNvbnRhaW4sIGtlZXAgZ29pbmcgaWYgZGlzdGFuY2UgaXMgZXF1YWwgdG8gbWluRGlzdGFuY2VcbiAgICBmdW5jdGlvbiggZGlzdCwgbWluRGlzdCApIHtcbiAgICAgIHJldHVybiBkaXN0IDw9IG1pbkRpc3Q7XG4gICAgfSA6IGZ1bmN0aW9uKCBkaXN0LCBtaW5EaXN0ICkge1xuICAgICAgcmV0dXJuIGRpc3QgPCBtaW5EaXN0O1xuICAgIH07XG4gIHdoaWxlICggY29uZGl0aW9uKCBkaXN0YW5jZSwgbWluRGlzdGFuY2UgKSApIHtcbiAgICAvLyBtZWFzdXJlIGRpc3RhbmNlIHRvIG5leHQgY2VsbFxuICAgIGluZGV4ICs9IGluY3JlbWVudDtcbiAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIGluZGV4ICk7XG4gICAgaWYgKCBkaXN0YW5jZSA9PT0gbnVsbCApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzdGFuY2U6IG1pbkRpc3RhbmNlLFxuICAgIC8vIHNlbGVjdGVkIHdhcyBwcmV2aW91cyBpbmRleFxuICAgIGluZGV4OiBpbmRleCAtIGluY3JlbWVudCxcbiAgfTtcbn07XG5cbi8qKlxuICogbWVhc3VyZSBkaXN0YW5jZSBiZXR3ZWVuIHggYW5kIGEgc2xpZGUgdGFyZ2V0XG4gKiBAcGFyYW0ge051bWJlcn0geCAtIGhvcml6b250YWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBzbGlkZSBpbmRleFxuICogQHJldHVybnMge051bWJlcn0gLSBzbGlkZSBkaXN0YW5jZVxuICovXG5wcm90by5nZXRTbGlkZURpc3RhbmNlID0gZnVuY3Rpb24oIHgsIGluZGV4ICkge1xuICB2YXIgbGVuID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICAvLyB3cmFwIGFyb3VuZCBpZiBhdCBsZWFzdCAyIHNsaWRlc1xuICB2YXIgaXNXcmFwQXJvdW5kID0gdGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgbGVuID4gMTtcbiAgdmFyIHNsaWRlSW5kZXggPSBpc1dyYXBBcm91bmQgPyB1dGlscy5tb2R1bG8oIGluZGV4LCBsZW4gKSA6IGluZGV4O1xuICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgc2xpZGVJbmRleCBdO1xuICBpZiAoICFzbGlkZSApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBhZGQgZGlzdGFuY2UgZm9yIHdyYXAtYXJvdW5kIHNsaWRlc1xuICB2YXIgd3JhcCA9IGlzV3JhcEFyb3VuZCA/IHRoaXMuc2xpZGVhYmxlV2lkdGggKiBNYXRoLmZsb29yKCBpbmRleC9sZW4gKSA6IDA7XG4gIHJldHVybiB4IC0gKCBzbGlkZS50YXJnZXQgKyB3cmFwICk7XG59O1xuXG5wcm90by5kcmFnRW5kQm9vc3RTZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IGJvb3N0IGlmIG5vIHByZXZpb3VzRHJhZ1ggb3IgZHJhZ01vdmVUaW1lXG4gIGlmICggdGhpcy5wcmV2aW91c0RyYWdYID09PSB1bmRlZmluZWQgfHwgIXRoaXMuZHJhZ01vdmVUaW1lIHx8XG4gICAgLy8gb3IgaWYgZHJhZyB3YXMgaGVsZCBmb3IgMTAwIG1zXG4gICAgbmV3IERhdGUoKSAtIHRoaXMuZHJhZ01vdmVUaW1lID4gMTAwICkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtdGhpcy5kcmFnWCwgdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIHZhciBkZWx0YSA9IHRoaXMucHJldmlvdXNEcmFnWCAtIHRoaXMuZHJhZ1g7XG4gIGlmICggZGlzdGFuY2UgPiAwICYmIGRlbHRhID4gMCApIHtcbiAgICAvLyBib29zdCB0byBuZXh0IGlmIG1vdmluZyB0b3dhcmRzIHRoZSByaWdodCwgYW5kIHBvc2l0aXZlIHZlbG9jaXR5XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoIGRpc3RhbmNlIDwgMCAmJiBkZWx0YSA8IDAgKSB7XG4gICAgLy8gYm9vc3QgdG8gcHJldmlvdXMgaWYgbW92aW5nIHRvd2FyZHMgdGhlIGxlZnQsIGFuZCBuZWdhdGl2ZSB2ZWxvY2l0eVxuICAgIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbi8vIC0tLS0tIHN0YXRpY0NsaWNrIC0tLS0tIC8vXG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBnZXQgY2xpY2tlZENlbGwsIGlmIGNlbGwgd2FzIGNsaWNrZWRcbiAgdmFyIGNsaWNrZWRDZWxsID0gdGhpcy5nZXRQYXJlbnRDZWxsKCBldmVudC50YXJnZXQgKTtcbiAgdmFyIGNlbGxFbGVtID0gY2xpY2tlZENlbGwgJiYgY2xpY2tlZENlbGwuZWxlbWVudDtcbiAgdmFyIGNlbGxJbmRleCA9IGNsaWNrZWRDZWxsICYmIHRoaXMuY2VsbHMuaW5kZXhPZiggY2xpY2tlZENlbGwgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnc3RhdGljQ2xpY2snLCBldmVudCwgWyBwb2ludGVyLCBjZWxsRWxlbSwgY2VsbEluZGV4IF0gKTtcbn07XG5cbi8vIC0tLS0tIHNjcm9sbCAtLS0tLSAvL1xuXG5wcm90by5vbnNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgdmFyIHNjcm9sbE1vdmVYID0gdGhpcy5wb2ludGVyRG93blNjcm9sbC54IC0gc2Nyb2xsLng7XG4gIHZhciBzY3JvbGxNb3ZlWSA9IHRoaXMucG9pbnRlckRvd25TY3JvbGwueSAtIHNjcm9sbC55O1xuICAvLyBjYW5jZWwgY2xpY2svdGFwIGlmIHNjcm9sbCBpcyB0b28gbXVjaFxuICBpZiAoIE1hdGguYWJzKCBzY3JvbGxNb3ZlWCApID4gMyB8fCBNYXRoLmFicyggc2Nyb2xsTW92ZVkgKSA+IDMgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvbmUoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gdXRpbHMgLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24oKSB7XG4gIHJldHVybiB7XG4gICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgfTtcbn1cblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBGbGlja2l0eTtcblxufSApICk7XG59KTtcblxudmFyIHByZXZOZXh0QnV0dG9uID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLy8gcHJldi9uZXh0IGJ1dHRvbnNcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICB1bmlwb2ludGVyLFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgICAgd2luZG93LlVuaXBvaW50ZXIsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pcG9pbnRlciwgdXRpbHMgKSB7XG5cbnZhciBzdmdVUkkgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmV2TmV4dEJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBQcmV2TmV4dEJ1dHRvbiggZGlyZWN0aW9uLCBwYXJlbnQgKSB7XG4gIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFVuaXBvaW50ZXIucHJvdG90eXBlICk7XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHByb3BlcnRpZXNcbiAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xuICB0aGlzLmlzUHJldmlvdXMgPSB0aGlzLmRpcmVjdGlvbiA9PSAtMTtcbiAgdmFyIGxlZnREaXJlY3Rpb24gPSB0aGlzLnBhcmVudC5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gMSA6IC0xO1xuICB0aGlzLmlzTGVmdCA9IHRoaXMuZGlyZWN0aW9uID09IGxlZnREaXJlY3Rpb247XG5cbiAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgZWxlbWVudC5jbGFzc05hbWUgPSAnZmxpY2tpdHktYnV0dG9uIGZsaWNraXR5LXByZXYtbmV4dC1idXR0b24nO1xuICBlbGVtZW50LmNsYXNzTmFtZSArPSB0aGlzLmlzUHJldmlvdXMgPyAnIHByZXZpb3VzJyA6ICcgbmV4dCc7XG4gIC8vIHByZXZlbnQgYnV0dG9uIGZyb20gc3VibWl0dGluZyBmb3JtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwODM2MDc2LzE4MjE4M1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ3R5cGUnLCAnYnV0dG9uJyApO1xuICAvLyBpbml0IGFzIGRpc2FibGVkXG4gIHRoaXMuZGlzYWJsZSgpO1xuXG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsIHRoaXMuaXNQcmV2aW91cyA/ICdQcmV2aW91cycgOiAnTmV4dCcgKTtcblxuICAvLyBjcmVhdGUgYXJyb3dcbiAgdmFyIHN2ZyA9IHRoaXMuY3JlYXRlU1ZHKCk7XG4gIGVsZW1lbnQuYXBwZW5kQ2hpbGQoIHN2ZyApO1xuICAvLyBldmVudHNcbiAgdGhpcy5wYXJlbnQub24oICdzZWxlY3QnLCB0aGlzLnVwZGF0ZS5iaW5kKCB0aGlzICkgKTtcbiAgdGhpcy5vbiggJ3BvaW50ZXJEb3duJywgdGhpcy5wYXJlbnQuY2hpbGRVSVBvaW50ZXJEb3duLmJpbmQoIHRoaXMucGFyZW50ICkgKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmJpbmRTdGFydEV2ZW50KCB0aGlzLmVsZW1lbnQgKTtcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMgKTtcbiAgLy8gYWRkIHRvIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5kZWFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSBmcm9tIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbiAgLy8gY2xpY2sgZXZlbnRzXG4gIHRoaXMudW5iaW5kU3RhcnRFdmVudCggdGhpcy5lbGVtZW50ICk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzICk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuY3JlYXRlU1ZHID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3N2ZycgKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ2ZsaWNraXR5LWJ1dHRvbi1pY29uJyApO1xuICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsICcwIDAgMTAwIDEwMCcgKTtcbiAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3BhdGgnICk7XG4gIHZhciBwYXRoTW92ZW1lbnRzID0gZ2V0QXJyb3dNb3ZlbWVudHMoIHRoaXMucGFyZW50Lm9wdGlvbnMuYXJyb3dTaGFwZSApO1xuICBwYXRoLnNldEF0dHJpYnV0ZSggJ2QnLCBwYXRoTW92ZW1lbnRzICk7XG4gIHBhdGguc2V0QXR0cmlidXRlKCAnY2xhc3MnLCAnYXJyb3cnICk7XG4gIC8vIHJvdGF0ZSBhcnJvd1xuICBpZiAoICF0aGlzLmlzTGVmdCApIHtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSggJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMTAwLCAxMDApIHJvdGF0ZSgxODApICcgKTtcbiAgfVxuICBzdmcuYXBwZW5kQ2hpbGQoIHBhdGggKTtcbiAgcmV0dXJuIHN2Zztcbn07XG5cbi8vIGdldCBTVkcgcGF0aCBtb3ZtZW1lbnRcbmZ1bmN0aW9uIGdldEFycm93TW92ZW1lbnRzKCBzaGFwZSApIHtcbiAgLy8gdXNlIHNoYXBlIGFzIG1vdmVtZW50IGlmIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBzaGFwZSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cbiAgLy8gY3JlYXRlIG1vdmVtZW50IHN0cmluZ1xuICByZXR1cm4gJ00gJyArIHNoYXBlLngwICsgJyw1MCcgK1xuICAgICcgTCAnICsgc2hhcGUueDEgKyAnLCcgKyAoIHNoYXBlLnkxICsgNTAgKSArXG4gICAgJyBMICcgKyBzaGFwZS54MiArICcsJyArICggc2hhcGUueTIgKyA1MCApICtcbiAgICAnIEwgJyArIHNoYXBlLngzICsgJyw1MCAnICtcbiAgICAnIEwgJyArIHNoYXBlLngyICsgJywnICsgKCA1MCAtIHNoYXBlLnkyICkgK1xuICAgICcgTCAnICsgc2hhcGUueDEgKyAnLCcgKyAoIDUwIC0gc2hhcGUueTEgKSArXG4gICAgJyBaJztcbn1cblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNFbmFibGVkICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBhcmVudC51aUNoYW5nZSgpO1xuICB2YXIgbWV0aG9kID0gdGhpcy5pc1ByZXZpb3VzID8gJ3ByZXZpb3VzJyA6ICduZXh0JztcbiAgdGhpcy5wYXJlbnRbIG1ldGhvZCBdKCk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuaXNFbmFibGVkICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudC5kaXNhYmxlZCA9IHRydWU7XG4gIHRoaXMuaXNFbmFibGVkID0gZmFsc2U7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGluZGV4IG9mIGZpcnN0IG9yIGxhc3Qgc2xpZGUsIGlmIHByZXZpb3VzIG9yIG5leHRcbiAgdmFyIHNsaWRlcyA9IHRoaXMucGFyZW50LnNsaWRlcztcbiAgLy8gZW5hYmxlIGlzIHdyYXBBcm91bmQgYW5kIGF0IGxlYXN0IDIgc2xpZGVzXG4gIGlmICggdGhpcy5wYXJlbnQub3B0aW9ucy53cmFwQXJvdW5kICYmIHNsaWRlcy5sZW5ndGggPiAxICkge1xuICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBzbGlkZXMubGVuZ3RoID8gc2xpZGVzLmxlbmd0aCAtIDEgOiAwO1xuICB2YXIgYm91bmRJbmRleCA9IHRoaXMuaXNQcmV2aW91cyA/IDAgOiBsYXN0SW5kZXg7XG4gIHZhciBtZXRob2QgPSB0aGlzLnBhcmVudC5zZWxlY3RlZEluZGV4ID09IGJvdW5kSW5kZXggPyAnZGlzYWJsZScgOiAnZW5hYmxlJztcbiAgdGhpc1sgbWV0aG9kIF0oKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB0aGlzLmFsbE9mZigpO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgcHJvdG90eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgcHJldk5leHRCdXR0b25zOiB0cnVlLFxuICBhcnJvd1NoYXBlOiB7XG4gICAgeDA6IDEwLFxuICAgIHgxOiA2MCwgeTE6IDUwLFxuICAgIHgyOiA3MCwgeTI6IDQwLFxuICAgIHgzOiAzMCxcbiAgfSxcbn0gKTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUHJldk5leHRCdXR0b25zJyk7XG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbnByb3RvLl9jcmVhdGVQcmV2TmV4dEJ1dHRvbnMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnByZXZOZXh0QnV0dG9ucyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnByZXZCdXR0b24gPSBuZXcgUHJldk5leHRCdXR0b24oIC0xLCB0aGlzICk7XG4gIHRoaXMubmV4dEJ1dHRvbiA9IG5ldyBQcmV2TmV4dEJ1dHRvbiggMSwgdGhpcyApO1xuXG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgKTtcbn07XG5cbnByb3RvLmFjdGl2YXRlUHJldk5leHRCdXR0b25zID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucHJldkJ1dHRvbi5hY3RpdmF0ZSgpO1xuICB0aGlzLm5leHRCdXR0b24uYWN0aXZhdGUoKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgKTtcbn07XG5cbnByb3RvLmRlYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wcmV2QnV0dG9uLmRlYWN0aXZhdGUoKTtcbiAgdGhpcy5uZXh0QnV0dG9uLmRlYWN0aXZhdGUoKTtcbiAgdGhpcy5vZmYoICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlUHJldk5leHRCdXR0b25zICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuRmxpY2tpdHkuUHJldk5leHRCdXR0b24gPSBQcmV2TmV4dEJ1dHRvbjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIgcGFnZURvdHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBwYWdlIGRvdHNcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICB1bmlwb2ludGVyLFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgICAgd2luZG93LlVuaXBvaW50ZXIsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pcG9pbnRlciwgdXRpbHMgKSB7XG5cbmZ1bmN0aW9uIFBhZ2VEb3RzKCBwYXJlbnQgKSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuUGFnZURvdHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVW5pcG9pbnRlci5wcm90b3R5cGUgKTtcblxuUGFnZURvdHMucHJvdG90eXBlLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gY3JlYXRlIGhvbGRlciBlbGVtZW50XG4gIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTtcbiAgdGhpcy5ob2xkZXIuY2xhc3NOYW1lID0gJ2ZsaWNraXR5LXBhZ2UtZG90cyc7XG4gIC8vIGNyZWF0ZSBkb3RzLCBhcnJheSBvZiBlbGVtZW50c1xuICB0aGlzLmRvdHMgPSBbXTtcbiAgLy8gZXZlbnRzXG4gIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCggdGhpcyApO1xuICB0aGlzLm9uKCAncG9pbnRlckRvd24nLCB0aGlzLnBhcmVudC5jaGlsZFVJUG9pbnRlckRvd24uYmluZCggdGhpcy5wYXJlbnQgKSApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2V0RG90cygpO1xuICB0aGlzLmhvbGRlci5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrICk7XG4gIHRoaXMuYmluZFN0YXJ0RXZlbnQoIHRoaXMuaG9sZGVyICk7XG4gIC8vIGFkZCB0byBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5ob2xkZXIgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5kZWFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaG9sZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2sgKTtcbiAgdGhpcy51bmJpbmRTdGFydEV2ZW50KCB0aGlzLmhvbGRlciApO1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy5ob2xkZXIgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5zZXREb3RzID0gZnVuY3Rpb24oKSB7XG4gIC8vIGdldCBkaWZmZXJlbmNlIGJldHdlZW4gbnVtYmVyIG9mIHNsaWRlcyBhbmQgbnVtYmVyIG9mIGRvdHNcbiAgdmFyIGRlbHRhID0gdGhpcy5wYXJlbnQuc2xpZGVzLmxlbmd0aCAtIHRoaXMuZG90cy5sZW5ndGg7XG4gIGlmICggZGVsdGEgPiAwICkge1xuICAgIHRoaXMuYWRkRG90cyggZGVsdGEgKTtcbiAgfSBlbHNlIGlmICggZGVsdGEgPCAwICkge1xuICAgIHRoaXMucmVtb3ZlRG90cyggLWRlbHRhICk7XG4gIH1cbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5hZGREb3RzID0gZnVuY3Rpb24oIGNvdW50ICkge1xuICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIHZhciBuZXdEb3RzID0gW107XG4gIHZhciBsZW5ndGggPSB0aGlzLmRvdHMubGVuZ3RoO1xuICB2YXIgbWF4ID0gbGVuZ3RoICsgY291bnQ7XG5cbiAgZm9yICggdmFyIGkgPSBsZW5ndGg7IGkgPCBtYXg7IGkrKyApIHtcbiAgICB2YXIgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBkb3QuY2xhc3NOYW1lID0gJ2RvdCc7XG4gICAgZG90LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnLCAnUGFnZSBkb3QgJyArICggaSArIDEgKSApO1xuICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb3QgKTtcbiAgICBuZXdEb3RzLnB1c2goIGRvdCApO1xuICB9XG5cbiAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoIGZyYWdtZW50ICk7XG4gIHRoaXMuZG90cyA9IHRoaXMuZG90cy5jb25jYXQoIG5ld0RvdHMgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5yZW1vdmVEb3RzID0gZnVuY3Rpb24oIGNvdW50ICkge1xuICAvLyByZW1vdmUgZnJvbSB0aGlzLmRvdHMgY29sbGVjdGlvblxuICB2YXIgcmVtb3ZlRG90cyA9IHRoaXMuZG90cy5zcGxpY2UoIHRoaXMuZG90cy5sZW5ndGggLSBjb3VudCwgY291bnQgKTtcbiAgLy8gcmVtb3ZlIGZyb20gRE9NXG4gIHJlbW92ZURvdHMuZm9yRWFjaCggZnVuY3Rpb24oIGRvdCApIHtcbiAgICB0aGlzLmhvbGRlci5yZW1vdmVDaGlsZCggZG90ICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS51cGRhdGVTZWxlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAvLyByZW1vdmUgc2VsZWN0ZWQgY2xhc3Mgb24gcHJldmlvdXNcbiAgaWYgKCB0aGlzLnNlbGVjdGVkRG90ICkge1xuICAgIHRoaXMuc2VsZWN0ZWREb3QuY2xhc3NOYW1lID0gJ2RvdCc7XG4gICAgdGhpcy5zZWxlY3RlZERvdC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICB9XG4gIC8vIGRvbid0IHByb2NlZWQgaWYgbm8gZG90c1xuICBpZiAoICF0aGlzLmRvdHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnNlbGVjdGVkRG90ID0gdGhpcy5kb3RzWyB0aGlzLnBhcmVudC5zZWxlY3RlZEluZGV4IF07XG4gIHRoaXMuc2VsZWN0ZWREb3QuY2xhc3NOYW1lID0gJ2RvdCBpcy1zZWxlY3RlZCc7XG4gIHRoaXMuc2VsZWN0ZWREb3Quc2V0QXR0cmlidXRlKCAnYXJpYS1jdXJyZW50JywgJ3N0ZXAnICk7XG59O1xuXG5QYWdlRG90cy5wcm90b3R5cGUub25UYXAgPSAvLyBvbGQgbWV0aG9kIG5hbWUsIGJhY2t3YXJkcy1jb21wYXRpYmxlXG5QYWdlRG90cy5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgLy8gb25seSBjYXJlIGFib3V0IGRvdCBjbGlja3NcbiAgaWYgKCB0YXJnZXQubm9kZU5hbWUgIT0gJ0xJJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnBhcmVudC51aUNoYW5nZSgpO1xuICB2YXIgaW5kZXggPSB0aGlzLmRvdHMuaW5kZXhPZiggdGFyZ2V0ICk7XG4gIHRoaXMucGFyZW50LnNlbGVjdCggaW5kZXggKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB0aGlzLmFsbE9mZigpO1xufTtcblxuRmxpY2tpdHkuUGFnZURvdHMgPSBQYWdlRG90cztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBwYWdlRG90czogdHJ1ZSxcbn0gKTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUGFnZURvdHMnKTtcblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUGFnZURvdHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnBhZ2VEb3RzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBhZ2VEb3RzID0gbmV3IFBhZ2VEb3RzKCB0aGlzICk7XG4gIC8vIGV2ZW50c1xuICB0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3NlbGVjdCcsIHRoaXMudXBkYXRlU2VsZWN0ZWRQYWdlRG90cyApO1xuICB0aGlzLm9uKCAnY2VsbENoYW5nZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3Jlc2l6ZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQYWdlRG90cyApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLmFjdGl2YXRlKCk7XG59O1xuXG5wcm90by51cGRhdGVTZWxlY3RlZFBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMudXBkYXRlU2VsZWN0ZWQoKTtcbn07XG5cbnByb3RvLnVwZGF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuc2V0RG90cygpO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuZGVhY3RpdmF0ZSgpO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbkZsaWNraXR5LlBhZ2VEb3RzID0gUGFnZURvdHM7XG5cbnJldHVybiBGbGlja2l0eTtcblxufSApICk7XG59KTtcblxudmFyIHBsYXllciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIHBsYXllciAmIGF1dG9QbGF5XG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgZXZFbWl0dGVyLFxuICAgICAgICB1dGlscyxcbiAgICAgICAgZmxpY2tpdHlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgZmFjdG9yeShcbiAgICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICAgICAgd2luZG93LkZsaWNraXR5XG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIEV2RW1pdHRlciwgdXRpbHMsIEZsaWNraXR5ICkge1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gUGxheWVyKCBwYXJlbnQgKSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLnN0YXRlID0gJ3N0b3BwZWQnO1xuICAvLyB2aXNpYmlsaXR5IGNoYW5nZSBldmVudCBoYW5kbGVyXG4gIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlID0gdGhpcy52aXNpYmlsaXR5Q2hhbmdlLmJpbmQoIHRoaXMgKTtcbiAgdGhpcy5vblZpc2liaWxpdHlQbGF5ID0gdGhpcy52aXNpYmlsaXR5UGxheS5iaW5kKCB0aGlzICk7XG59XG5cblBsYXllci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbi8vIHN0YXJ0IHBsYXlcblBsYXllci5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BsYXlpbmcnICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBkbyBub3QgcGxheSBpZiBwYWdlIGlzIGhpZGRlbiwgc3RhcnQgcGxheWluZyB3aGVuIHBhZ2UgaXMgdmlzaWJsZVxuICB2YXIgaXNQYWdlSGlkZGVuID0gZG9jdW1lbnQuaGlkZGVuO1xuICBpZiAoIGlzUGFnZUhpZGRlbiApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5UGxheSApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuc3RhdGUgPSAncGxheWluZyc7XG4gIC8vIGxpc3RlbiB0byB2aXNpYmlsaXR5IGNoYW5nZVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlICk7XG4gIC8vIHN0YXJ0IHRpY2tpbmdcbiAgdGhpcy50aWNrKCk7XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IHRpY2sgaWYgbm90IHBsYXlpbmdcbiAgaWYgKCB0aGlzLnN0YXRlICE9ICdwbGF5aW5nJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGltZSA9IHRoaXMucGFyZW50Lm9wdGlvbnMuYXV0b1BsYXk7XG4gIC8vIGRlZmF1bHQgdG8gMyBzZWNvbmRzXG4gIHRpbWUgPSB0eXBlb2YgdGltZSA9PSAnbnVtYmVyJyA/IHRpbWUgOiAzMDAwO1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICAvLyBIQUNLOiByZXNldCB0aWNrcyBpZiBzdG9wcGVkIGFuZCBzdGFydGVkIHdpdGhpbiBpbnRlcnZhbFxuICB0aGlzLmNsZWFyKCk7XG4gIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgIF90aGlzLnBhcmVudC5uZXh0KCB0cnVlICk7XG4gICAgX3RoaXMudGljaygpO1xuICB9LCB0aW1lICk7XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zdGF0ZSA9ICdzdG9wcGVkJztcbiAgdGhpcy5jbGVhcigpO1xuICAvLyByZW1vdmUgdmlzaWJpbGl0eSBjaGFuZ2UgZXZlbnRcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICBjbGVhclRpbWVvdXQoIHRoaXMudGltZW91dCApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BsYXlpbmcnICkge1xuICAgIHRoaXMuc3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn07XG5cblBsYXllci5wcm90b3R5cGUudW5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZS1zdGFydCBwbGF5IGlmIHBhdXNlZFxuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BhdXNlZCcgKSB7XG4gICAgdGhpcy5wbGF5KCk7XG4gIH1cbn07XG5cbi8vIHBhdXNlIGlmIHBhZ2UgdmlzaWJpbGl0eSBpcyBoaWRkZW4sIHVucGF1c2UgaWYgdmlzaWJsZVxuUGxheWVyLnByb3RvdHlwZS52aXNpYmlsaXR5Q2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpc1BhZ2VIaWRkZW4gPSBkb2N1bWVudC5oaWRkZW47XG4gIHRoaXNbIGlzUGFnZUhpZGRlbiA/ICdwYXVzZScgOiAndW5wYXVzZScgXSgpO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS52aXNpYmlsaXR5UGxheSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXkoKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eVBsYXkgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgcGF1c2VBdXRvUGxheU9uSG92ZXI6IHRydWUsXG59ICk7XG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZVBsYXllcicpO1xudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyID0gbmV3IFBsYXllciggdGhpcyApO1xuXG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuYWN0aXZhdGVQbGF5ZXIgKTtcbiAgdGhpcy5vbiggJ3VpQ2hhbmdlJywgdGhpcy5zdG9wUGxheWVyICk7XG4gIHRoaXMub24oICdwb2ludGVyRG93bicsIHRoaXMuc3RvcFBsYXllciApO1xuICB0aGlzLm9uKCAnZGVhY3RpdmF0ZScsIHRoaXMuZGVhY3RpdmF0ZVBsYXllciApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLmF1dG9QbGF5ICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBsYXllci5wbGF5KCk7XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2VlbnRlcicsIHRoaXMgKTtcbn07XG5cbi8vIFBsYXllciBBUEksIGRvbid0IGhhdGUgdGhlIC4uLiB0aGFua3MgSSBrbm93IHdoZXJlIHRoZSBkb29yIGlzXG5cbnByb3RvLnBsYXlQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIucGxheSgpO1xufTtcblxucHJvdG8uc3RvcFBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5zdG9wKCk7XG59O1xuXG5wcm90by5wYXVzZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5wYXVzZSgpO1xufTtcblxucHJvdG8udW5wYXVzZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci51bnBhdXNlKCk7XG59O1xuXG5wcm90by5kZWFjdGl2YXRlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnN0b3AoKTtcbiAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgdGhpcyApO1xufTtcblxuLy8gLS0tLS0gbW91c2VlbnRlci9sZWF2ZSAtLS0tLSAvL1xuXG4vLyBwYXVzZSBhdXRvLXBsYXkgb24gaG92ZXJcbnByb3RvLm9ubW91c2VlbnRlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMucGF1c2VBdXRvUGxheU9uSG92ZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2VsZWF2ZScsIHRoaXMgKTtcbn07XG5cbi8vIHJlc3VtZSBhdXRvLXBsYXkgb24gaG92ZXIgb2ZmXG5wcm90by5vbm1vdXNlbGVhdmUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIudW5wYXVzZSgpO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuRmxpY2tpdHkuUGxheWVyID0gUGxheWVyO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0gKSApO1xufSk7XG5cbnZhciBhZGRSZW1vdmVDZWxsID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLy8gYWRkLCByZW1vdmUgY2VsbFxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgZmxpY2tpdHksXG4gICAgICAgIHV0aWxzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIHV0aWxzICkge1xuXG4vLyBhcHBlbmQgY2VsbHMgdG8gYSBkb2N1bWVudCBmcmFnbWVudFxuZnVuY3Rpb24gZ2V0Q2VsbHNGcmFnbWVudCggY2VsbHMgKSB7XG4gIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNlbGwuZWxlbWVudCApO1xuICB9ICk7XG4gIHJldHVybiBmcmFnbWVudDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWRkL3JlbW92ZSBjZWxsIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbi8qKlxuICogSW5zZXJ0LCBwcmVwZW5kLCBvciBhcHBlbmQgY2VsbHNcbiAqIEBwYXJhbSB7W0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdF19IGVsZW1zIC0gRWxlbWVudHMgdG8gaW5zZXJ0XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IC0gWmVyby1iYXNlZCBudW1iZXIgdG8gaW5zZXJ0XG4gKi9cbnByb3RvLmluc2VydCA9IGZ1bmN0aW9uKCBlbGVtcywgaW5kZXggKSB7XG4gIHZhciBjZWxscyA9IHRoaXMuX21ha2VDZWxscyggZWxlbXMgKTtcbiAgaWYgKCAhY2VsbHMgfHwgIWNlbGxzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlbiA9IHRoaXMuY2VsbHMubGVuZ3RoO1xuICAvLyBkZWZhdWx0IHRvIGFwcGVuZFxuICBpbmRleCA9IGluZGV4ID09PSB1bmRlZmluZWQgPyBsZW4gOiBpbmRleDtcbiAgLy8gYWRkIGNlbGxzIHdpdGggZG9jdW1lbnQgZnJhZ21lbnRcbiAgdmFyIGZyYWdtZW50ID0gZ2V0Q2VsbHNGcmFnbWVudCggY2VsbHMgKTtcbiAgLy8gYXBwZW5kIHRvIHNsaWRlclxuICB2YXIgaXNBcHBlbmQgPSBpbmRleCA9PSBsZW47XG4gIGlmICggaXNBcHBlbmQgKSB7XG4gICAgdGhpcy5zbGlkZXIuYXBwZW5kQ2hpbGQoIGZyYWdtZW50ICk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluc2VydENlbGxFbGVtZW50ID0gdGhpcy5jZWxsc1sgaW5kZXggXS5lbGVtZW50O1xuICAgIHRoaXMuc2xpZGVyLmluc2VydEJlZm9yZSggZnJhZ21lbnQsIGluc2VydENlbGxFbGVtZW50ICk7XG4gIH1cbiAgLy8gYWRkIHRvIHRoaXMuY2VsbHNcbiAgaWYgKCBpbmRleCA9PT0gMCApIHtcbiAgICAvLyBwcmVwZW5kLCBhZGQgdG8gc3RhcnRcbiAgICB0aGlzLmNlbGxzID0gY2VsbHMuY29uY2F0KCB0aGlzLmNlbGxzICk7XG4gIH0gZWxzZSBpZiAoIGlzQXBwZW5kICkge1xuICAgIC8vIGFwcGVuZCwgYWRkIHRvIGVuZFxuICAgIHRoaXMuY2VsbHMgPSB0aGlzLmNlbGxzLmNvbmNhdCggY2VsbHMgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbnNlcnQgaW4gdGhpcy5jZWxsc1xuICAgIHZhciBlbmRDZWxscyA9IHRoaXMuY2VsbHMuc3BsaWNlKCBpbmRleCwgbGVuIC0gaW5kZXggKTtcbiAgICB0aGlzLmNlbGxzID0gdGhpcy5jZWxscy5jb25jYXQoIGNlbGxzICkuY29uY2F0KCBlbmRDZWxscyApO1xuICB9XG5cbiAgdGhpcy5fc2l6ZUNlbGxzKCBjZWxscyApO1xuICB0aGlzLmNlbGxDaGFuZ2UoIGluZGV4LCB0cnVlICk7XG59O1xuXG5wcm90by5hcHBlbmQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHRoaXMuaW5zZXJ0KCBlbGVtcywgdGhpcy5jZWxscy5sZW5ndGggKTtcbn07XG5cbnByb3RvLnByZXBlbmQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHRoaXMuaW5zZXJ0KCBlbGVtcywgMCApO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgY2VsbHNcbiAqIEBwYXJhbSB7W0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdF19IGVsZW1zIC0gRUxlbWVudHMgdG8gcmVtb3ZlXG4gKi9cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGNlbGxzID0gdGhpcy5nZXRDZWxscyggZWxlbXMgKTtcbiAgaWYgKCAhY2VsbHMgfHwgIWNlbGxzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWluQ2VsbEluZGV4ID0gdGhpcy5jZWxscy5sZW5ndGggLSAxO1xuICAvLyByZW1vdmUgY2VsbHMgZnJvbSBjb2xsZWN0aW9uICYgRE9NXG4gIGNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGNlbGwucmVtb3ZlKCk7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5jZWxscy5pbmRleE9mKCBjZWxsICk7XG4gICAgbWluQ2VsbEluZGV4ID0gTWF0aC5taW4oIGluZGV4LCBtaW5DZWxsSW5kZXggKTtcbiAgICB1dGlscy5yZW1vdmVGcm9tKCB0aGlzLmNlbGxzLCBjZWxsICk7XG4gIH0sIHRoaXMgKTtcblxuICB0aGlzLmNlbGxDaGFuZ2UoIG1pbkNlbGxJbmRleCwgdHJ1ZSApO1xufTtcblxuLyoqXG4gKiBsb2dpYyB0byBiZSBydW4gYWZ0ZXIgYSBjZWxsJ3Mgc2l6ZSBjaGFuZ2VzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW0gLSBjZWxsJ3MgZWxlbWVudFxuICovXG5wcm90by5jZWxsU2l6ZUNoYW5nZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xuICBpZiAoICFjZWxsICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjZWxsLmdldFNpemUoKTtcblxuICB2YXIgaW5kZXggPSB0aGlzLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgdGhpcy5jZWxsQ2hhbmdlKCBpbmRleCApO1xufTtcblxuLyoqXG4gKiBsb2dpYyBhbnkgdGltZSBhIGNlbGwgaXMgY2hhbmdlZDogYWRkZWQsIHJlbW92ZWQsIG9yIHNpemUgY2hhbmdlZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBjaGFuZ2VkQ2VsbEluZGV4IC0gaW5kZXggb2YgdGhlIGNoYW5nZWQgY2VsbCwgb3B0aW9uYWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNQb3NpdGlvbmluZ1NsaWRlciAtIFBvc2l0aW9ucyBzbGlkZXIgYWZ0ZXIgc2VsZWN0aW9uXG4gKi9cbnByb3RvLmNlbGxDaGFuZ2UgPSBmdW5jdGlvbiggY2hhbmdlZENlbGxJbmRleCwgaXNQb3NpdGlvbmluZ1NsaWRlciApIHtcbiAgdmFyIHByZXZTZWxlY3RlZEVsZW0gPSB0aGlzLnNlbGVjdGVkRWxlbWVudDtcbiAgdGhpcy5fcG9zaXRpb25DZWxscyggY2hhbmdlZENlbGxJbmRleCApO1xuICB0aGlzLl9nZXRXcmFwU2hpZnRDZWxscygpO1xuICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIC8vIHVwZGF0ZSBzZWxlY3RlZEluZGV4XG4gIC8vIHRyeSB0byBtYWludGFpbiBwb3NpdGlvbiAmIHNlbGVjdCBwcmV2aW91cyBzZWxlY3RlZCBlbGVtZW50XG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBwcmV2U2VsZWN0ZWRFbGVtICk7XG4gIGlmICggY2VsbCApIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmdldENlbGxTbGlkZUluZGV4KCBjZWxsICk7XG4gIH1cbiAgdGhpcy5zZWxlY3RlZEluZGV4ID0gTWF0aC5taW4oIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEsIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuXG4gIHRoaXMuZW1pdEV2ZW50KCAnY2VsbENoYW5nZScsIFsgY2hhbmdlZENlbGxJbmRleCBdICk7XG4gIC8vIHBvc2l0aW9uIHNsaWRlclxuICB0aGlzLnNlbGVjdCggdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIC8vIGRvIG5vdCBwb3NpdGlvbiBzbGlkZXIgYWZ0ZXIgbGF6eSBsb2FkXG4gIGlmICggaXNQb3NpdGlvbmluZ1NsaWRlciApIHtcbiAgICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xuICB9XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIgbGF6eWxvYWQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBsYXp5bG9hZFxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgZmxpY2tpdHksXG4gICAgICAgIHV0aWxzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIHV0aWxzICkge1xuXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzLnB1c2goJ19jcmVhdGVMYXp5bG9hZCcpO1xudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlTGF6eWxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vbiggJ3NlbGVjdCcsIHRoaXMubGF6eUxvYWQgKTtcbn07XG5cbnByb3RvLmxhenlMb2FkID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsYXp5TG9hZCA9IHRoaXMub3B0aW9ucy5sYXp5TG9hZDtcbiAgaWYgKCAhbGF6eUxvYWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCBhZGphY2VudCBjZWxscywgdXNlIGxhenlMb2FkIG9wdGlvbiBmb3IgYWRqYWNlbnQgY291bnRcbiAgdmFyIGFkakNvdW50ID0gdHlwZW9mIGxhenlMb2FkID09ICdudW1iZXInID8gbGF6eUxvYWQgOiAwO1xuICB2YXIgY2VsbEVsZW1zID0gdGhpcy5nZXRBZGphY2VudENlbGxFbGVtZW50cyggYWRqQ291bnQgKTtcbiAgLy8gZ2V0IGxhenkgaW1hZ2VzIGluIHRob3NlIGNlbGxzXG4gIHZhciBsYXp5SW1hZ2VzID0gW107XG4gIGNlbGxFbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbEVsZW0gKSB7XG4gICAgdmFyIGxhenlDZWxsSW1hZ2VzID0gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICk7XG4gICAgbGF6eUltYWdlcyA9IGxhenlJbWFnZXMuY29uY2F0KCBsYXp5Q2VsbEltYWdlcyApO1xuICB9ICk7XG4gIC8vIGxvYWQgbGF6eSBpbWFnZXNcbiAgbGF6eUltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggaW1nICkge1xuICAgIG5ldyBMYXp5TG9hZGVyKCBpbWcsIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuZnVuY3Rpb24gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICkge1xuICAvLyBjaGVjayBpZiBjZWxsIGVsZW1lbnQgaXMgbGF6eSBpbWFnZVxuICBpZiAoIGNlbGxFbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHZhciBsYXp5bG9hZEF0dHIgPSBjZWxsRWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgICB2YXIgc3JjQXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmMnKTtcbiAgICB2YXIgc3Jjc2V0QXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmNzZXQnKTtcbiAgICBpZiAoIGxhenlsb2FkQXR0ciB8fCBzcmNBdHRyIHx8IHNyY3NldEF0dHIgKSB7XG4gICAgICByZXR1cm4gWyBjZWxsRWxlbSBdO1xuICAgIH1cbiAgfVxuICAvLyBzZWxlY3QgbGF6eSBpbWFnZXMgaW4gY2VsbFxuICB2YXIgbGF6eVNlbGVjdG9yID0gJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkXSwgJyArXG4gICAgJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY10sIGltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY3NldF0nO1xuICB2YXIgaW1ncyA9IGNlbGxFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIGxhenlTZWxlY3RvciApO1xuICByZXR1cm4gdXRpbHMubWFrZUFycmF5KCBpbWdzICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExhenlMb2FkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBjbGFzcyB0byBoYW5kbGUgbG9hZGluZyBpbWFnZXNcbiAqIEBwYXJhbSB7SW1hZ2V9IGltZyAtIEltYWdlIGVsZW1lbnRcbiAqIEBwYXJhbSB7RmxpY2tpdHl9IGZsaWNraXR5IC0gRmxpY2tpdHkgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gTGF6eUxvYWRlciggaW1nLCBmbGlja2l0eSApIHtcbiAgdGhpcy5pbWcgPSBpbWc7XG4gIHRoaXMuZmxpY2tpdHkgPSBmbGlja2l0eTtcbiAgdGhpcy5sb2FkKCk7XG59XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgLy8gZ2V0IHNyYyAmIHNyY3NldFxuICB2YXIgc3JjID0gdGhpcy5pbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkJykgfHxcbiAgICB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3JjJyk7XG4gIHZhciBzcmNzZXQgPSB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG4gIC8vIHNldCBzcmMgJiBzZXJzZXRcbiAgdGhpcy5pbWcuc3JjID0gc3JjO1xuICBpZiAoIHNyY3NldCApIHtcbiAgICB0aGlzLmltZy5zZXRBdHRyaWJ1dGUoICdzcmNzZXQnLCBzcmNzZXQgKTtcbiAgfVxuICAvLyByZW1vdmUgYXR0clxuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgdGhpcy5pbWcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyYycpO1xuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG59O1xuXG5MYXp5TG9hZGVyLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWxvYWRlZCcgKTtcbn07XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWVycm9yJyApO1xufTtcblxuTGF6eUxvYWRlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiggZXZlbnQsIGNsYXNzTmFtZSApIHtcbiAgLy8gdW5iaW5kIGV2ZW50c1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuXG4gIHZhciBjZWxsID0gdGhpcy5mbGlja2l0eS5nZXRQYXJlbnRDZWxsKCB0aGlzLmltZyApO1xuICB2YXIgY2VsbEVsZW0gPSBjZWxsICYmIGNlbGwuZWxlbWVudDtcbiAgdGhpcy5mbGlja2l0eS5jZWxsU2l6ZUNoYW5nZSggY2VsbEVsZW0gKTtcblxuICB0aGlzLmltZy5jbGFzc0xpc3QuYWRkKCBjbGFzc05hbWUgKTtcbiAgdGhpcy5mbGlja2l0eS5kaXNwYXRjaEV2ZW50KCAnbGF6eUxvYWQnLCBldmVudCwgY2VsbEVsZW0gKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5MYXp5TG9hZGVyID0gTGF6eUxvYWRlcjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIganMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKiFcbiAqIEZsaWNraXR5IHYyLjMuMFxuICogVG91Y2gsIHJlc3BvbnNpdmUsIGZsaWNrYWJsZSBjYXJvdXNlbHNcbiAqXG4gKiBMaWNlbnNlZCBHUEx2MyBmb3Igb3BlbiBzb3VyY2UgdXNlXG4gKiBvciBGbGlja2l0eSBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlXG4gKlxuICogaHR0cHM6Ly9mbGlja2l0eS5tZXRhZml6enkuY29cbiAqIENvcHlyaWdodCAyMDE1LTIwMjEgTWV0YWZpenp5XG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICBkcmFnLFxuICAgICAgICBwcmV2TmV4dEJ1dHRvbixcbiAgICAgICAgcGFnZURvdHMsXG4gICAgICAgIHBsYXllcixcbiAgICAgICAgYWRkUmVtb3ZlQ2VsbCxcbiAgICAgICAgbGF6eWxvYWRcbiAgICApO1xuICB9XG5cbn0gKSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCBGbGlja2l0eSApIHtcbiAgcmV0dXJuIEZsaWNraXR5O1xufSApO1xufSk7XG5cbnZhciBDb21wbGVtZW50YXJ5UHJvZHVjdHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb21wbGVtZW50YXJ5UHJvZHVjdHMob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wbGVtZW50YXJ5UHJvZHVjdHMpO1xuXG4gICAgdGhpcy5zZWN0aW9uRWwgPSBvcHRpb25zLnNlY3Rpb25FbDtcbiAgICB0aGlzLnNlY3Rpb25JZCA9IG9wdGlvbnMuc2VjdGlvbklkO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMucHJvZHVjdElkID0gb3B0aW9ucy5wcm9kdWN0SWQ7XG4gICAgdGhpcy5pbmNsdWRlSW5kaWNhdG9yRG90cyA9IG9wdGlvbnMuaW5jbHVkZUluZGljYXRvckRvdHMgfHwgZmFsc2U7XG4gICAgdGhpcy5yZWNvbW1lbmRhdGlvbnNSb3V0ZSA9IG9wdGlvbnMucHJvZHVjdFJlY29tbWVuZGF0aW9uc1JvdXRlO1xuICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0O1xuICAgIHZhciBkZWZhdWx0QXJyb3dTaGFwZSA9IHtcbiAgICAgIHgwOiAxMCxcbiAgICAgIHgxOiA2MCxcbiAgICAgIHkxOiA1MCxcbiAgICAgIHgyOiA2NSxcbiAgICAgIHkyOiA0NSxcbiAgICAgIHgzOiAyMFxuICAgIH07XG4gICAgdGhpcy5hcnJvd1NoYXBlID0gb3B0aW9ucy5hcnJvd1NoYXBlIHx8IGRlZmF1bHRBcnJvd1NoYXBlO1xuICAgIHRoaXMucmVjb21tZW5kYXRpb25zRWwgPSB0aGlzLnNlY3Rpb25FbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb21wbGVtZW50YXJ5LXByb2R1Y3RzXScpO1xuICAgIHRoaXMubG9hZFJlY29tbWVuZGF0aW9ucygpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbXBsZW1lbnRhcnlQcm9kdWN0cywgW3tcbiAgICBrZXk6IFwibG9hZFJlY29tbWVuZGF0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkUmVjb21tZW5kYXRpb25zKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHVybCA9IFwiXCIuY29uY2F0KHRoaXMucmVjb21tZW5kYXRpb25zUm91dGUsIFwiP3NlY3Rpb25faWQ9XCIpLmNvbmNhdCh0aGlzLnNlY3Rpb25JZCwgXCImbGltaXQ9XCIpLmNvbmNhdCh0aGlzLmxpbWl0LCBcIiZwcm9kdWN0X2lkPVwiKS5jb25jYXQodGhpcy5wcm9kdWN0SWQsIFwiJmludGVudD1jb21wbGVtZW50YXJ5XCIpO1xuICAgICAgQXN5bmNWaWV3LmxvYWQodXJsLCB7XG4gICAgICAgIHZpZXc6ICcnXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBodG1sID0gX3JlZi5odG1sO1xuICAgICAgICBpZiAoX3R5cGVvZihodG1sKSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoaHRtbCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGh0bWwudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIF90aGlzLnJlY29tbWVuZGF0aW9uc0VsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZW1lbnRhcnktcHJvZHVjdHMtLW5vLXJlY29tbWVuZGF0aW9ucycpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMucmVjb21tZW5kYXRpb25zRWwuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgICBpZiAoIXJpbWcuaW5zdGFuY2UpIHtcbiAgICAgICAgICByaW1nLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJpbWcud2F0Y2goX3RoaXMucmVjb21tZW5kYXRpb25zRWwpO1xuXG4gICAgICAgIHZhciBzbGlkZXIgPSBfdGhpcy5yZWNvbW1lbmRhdGlvbnNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zbGlkZXJdJyk7XG5cbiAgICAgICAgdmFyIHNsaWRlcyA9IF90aGlzLnJlY29tbWVuZGF0aW9uc0VsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsaWRlXScpO1xuXG4gICAgICAgIGlmIChzbGlkZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIF90aGlzLnNsaWRlciA9IG5ldyBqcyhzbGlkZXIsIHtcbiAgICAgICAgICAgIGNlbGxTZWxlY3RvcjogJ1tkYXRhLXNsaWRlXScsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiBmYWxzZSxcbiAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIGF1dG9QbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgICAgIGltYWdlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VEb3RzOiBfdGhpcy5pbmNsdWRlSW5kaWNhdG9yRG90cyxcbiAgICAgICAgICAgIHdyYXBBcm91bmQ6IHRydWUsXG4gICAgICAgICAgICBhcnJvd1NoYXBlOiBfdGhpcy5hcnJvd1NoYXBlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpcy5ldmVudHMucmVnaXN0ZXIoc2xpZGVyLCAncmltZzpsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc2xpZGVyLnJlc2l6ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5sb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIHRoaXMuc2xpZGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcGxlbWVudGFyeVByb2R1Y3RzO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBDb21wbGVtZW50YXJ5UHJvZHVjdHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js":
+/*!********************************************************************************!*\
+ !*** ./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js ***!
+ \********************************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/pxs-gift-card-recipient-form v1.1.0\n * (c) 2024 Pixel Union\n */\n\nfunction unwrapExports (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar EventHandler_1 = createCommonjsModule(function (module, exports) {\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n function EventHandler() {\n this.events = [];\n }\n EventHandler.prototype.register = function (el, event, listener) {\n if (!el || !event || !listener)\n return null;\n this.events.push({ el: el, event: event, listener: listener });\n el.addEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregister = function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n if (!el || !event || !listener)\n return null;\n this.events = this.events.filter(function (e) { return el !== e.el\n || event !== e.event || listener !== e.listener; });\n el.removeEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregisterAll = function () {\n this.events.forEach(function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n return el.removeEventListener(event, listener);\n });\n this.events = [];\n };\n return EventHandler;\n}());\nexports[\"default\"] = EventHandler;\n});\n\nvar EventHandler = unwrapExports(EventHandler_1);\n\n/*!\n * @pixelunion/animations v0.1.0\n * (c) 2019 Pixel Union\n * Released under the UNLICENSED license.\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * Promisified version of window.requestAnimationFrame.\n * @returns {Promise} Promise will resolve when requestAnimationFrame callback is run.\n */\nfunction raf() {\n return new Promise(function (resolve) {\n window.requestAnimationFrame(resolve);\n });\n}\n/**\n * Represents an HTML element with associate states\n */\n\n\nvar Animation =\n/*#__PURE__*/\nfunction () {\n /**\n * @param {Object} options\n * @param {HTMLElement} options.el Target element\n * @param {String} [options.state=initial] Initial state. This is also the default state.\n * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to\n * update with change of state.\n * @param {String} [options.endEvent=transitionend] Event to listen for at end of state change.\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n * next state change.\n * @param {Function} [options.onStart] Callback to execute immediate after\n * applying stateChangeAttribute.\n */\n function Animation(options) {\n _classCallCheck(this, Animation);\n\n this._el = options.el;\n this.cancelRunning = null;\n this._state = options.state || 'initial';\n this.initialState = this._state;\n this.stateAttribute = options.stateAttribute || 'data-animation-state';\n this.stateChangeAttribute = options.stateChangeAttribute || 'data-animation';\n this.endEvent = options.endEvent || 'transitionend';\n this.hold = !!options.hold;\n\n this.onStart = options.onStart || function () {\n /* do nothing */\n };\n\n this.activeEventHandler = null;\n }\n /**\n * Returns target element\n *\n * @return {HTMLElement} Target element\n */\n\n\n _createClass(Animation, [{\n key: \"isState\",\n\n /**\n * Check if a state is active\n * @param {String} state State to compare\n *\n * @return {Boolean}\n */\n value: function isState(state) {\n return state === this._state;\n }\n /**\n * Sequences a change to a new state.\n * @param {String} state Target state\n *\n * @param {Boolean} options.force Switch to final state immediately\n *\n * @param {Function} options.onStart Callback to execute immediately after\n * applying stateChangeAttribute for this state change only.\n *\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n * next state change.\n *\n * @return {Promise} Resolves when endEvent triggered\n */\n\n }, {\n key: \"animateTo\",\n value: function animateTo(state) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var from = this._el.dataset[this.stateAttribute] || this._state;\n var to = state || this.initialState;\n var force = options.force;\n var hold = 'hold' in options ? options.hold : this.hold;\n return new Promise(function (resolve) {\n if (_this.cancelRunning) {\n _this.cancelRunning();\n }\n\n if (from === to) {\n // Removing this here fixes some lingering attributes. But why?\n _this._el.removeAttribute(_this.stateChangeAttribute);\n\n resolve(from, null);\n return;\n }\n\n var running = true;\n\n _this.cancelRunning = function () {\n running = false;\n resolve(null, null);\n };\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this.activeEventHandler = null;\n\n if (force) {\n _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n _this.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n\n if (typeof options.onStart === 'function') {\n options.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n }\n\n _this._el.setAttribute(_this.stateAttribute, to);\n\n _this._state = to;\n\n if (!hold) {\n _this._el.removeAttribute(_this.stateChangeAttribute);\n }\n\n resolve(to, null);\n return;\n }\n\n raf().then(function () {\n if (!running) throw new Error('cancelled');\n\n _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n _this.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n\n if (typeof options.onStart === 'function') {\n options.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n }\n\n return raf();\n }).then(function () {\n if (!running) throw new Error('cancelled');\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this.activeEventHandler = function (e) {\n // Ignore any events bubbling up\n if (e.target !== _this._el || !running) return;\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n if (!hold) {\n _this._el.removeAttribute(_this.stateChangeAttribute);\n }\n\n resolve(to, e);\n };\n\n _this._el.addEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this._el.setAttribute(_this.stateAttribute, to);\n\n _this._state = to;\n })[\"catch\"](function (error) {\n // Only catch 'cancelled' errors.\n if (error.message !== 'cancelled') throw error;\n });\n });\n }\n /**\n * Remove any event listeners\n */\n\n }, {\n key: \"unload\",\n value: function unload() {\n this._el.removeEventListener(this.endEvent, this.activeEventHandler);\n\n this.activeEventHandler = null;\n }\n }, {\n key: \"el\",\n get: function get() {\n return this._el;\n }\n /**\n * Returns current state\n *\n * @return {String} Current state\n */\n\n }, {\n key: \"state\",\n get: function get() {\n return this._state;\n }\n }]);\n\n return Animation;\n}();\n\nfunction transition(options) {\n return new Animation(options);\n}\n\nclass RecipientForm {\n constructor(el) {\n this.el = el;\n this.events = new EventHandler();\n this.recipientForm = this.el.querySelector('[data-recipient-form]');\n this.recipientFormInputs = this.el.querySelectorAll('[data-recipient-form-input]');\n this.recipientFormEmailInput = this.el.querySelector('[data-recipient-form-email-input]');\n this.disclosure = this.el.querySelector('[data-recipient-disclosure]');\n this.disclosureCheckbox = this.el.querySelector('[data-recipient-disclosure-checkbox]');\n this.checkmark = this.disclosure.querySelector('.checkmark');\n this.checkmarkCheck = this.disclosure.querySelector('.checkmark__check');\n this.fillAnimation = transition({\n el: this.checkmark\n });\n this.checkAnimation = transition({\n el: this.checkmarkCheck\n });\n this.events.register(this.recipientForm, 'keydown', event => this._onKeydown(event));\n this.events.register(this.disclosure, 'toggle', () => this._onToggle());\n this.events.register(this.disclosureCheckbox, 'change', () => this._onChange());\n }\n\n _onChange() {\n this.disclosure.open = this.disclosureCheckbox.checked;\n }\n\n _onKeydown(event) {\n // Prevent input form submission\n if (event.key === 'Enter' && event.target.matches('[data-recipient-form-input]')) {\n event.preventDefault();\n }\n }\n\n _onToggle() {\n if (this.disclosure.open) {\n this._showRecipientForm();\n } else {\n this._hideRecipientForm();\n }\n }\n\n _showRecipientForm() {\n if (this.checkmark && this.checkmarkCheck) {\n this.fillAnimation.animateTo('checked');\n this.checkAnimation.animateTo('checked');\n }\n\n this.disclosureCheckbox.checked = true;\n this.recipientFormEmailInput.required = true;\n }\n\n _hideRecipientForm() {\n if (this.checkmark && this.checkmarkCheck) {\n this.fillAnimation.animateTo('unchecked');\n this.checkAnimation.animateTo('unchecked');\n }\n\n this.disclosureCheckbox.checked = false;\n this.recipientFormEmailInput.required = false;\n\n this._resetRecipientForm();\n }\n\n _resetRecipientForm() {\n this.recipientFormInputs.forEach(el => {\n el.value = '';\n\n if (el.classList.contains('form-field-filled')) {\n el.classList.remove('form-field-filled');\n }\n });\n\n if (this.recipientForm.classList.contains('recipient-form--has-errors')) {\n this.recipientForm.classList.remove('recipient-form--has-errors');\n }\n }\n\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RecipientForm);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLWdpZnQtY2FyZC1yZWNpcGllbnQtZm9ybS9kaXN0L2luZGV4LmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9weHMtZ2lmdC1jYXJkLXJlY2lwaWVudC1mb3JtL2Rpc3QvaW5kZXguZXMuanM/NTZjOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vcHhzLWdpZnQtY2FyZC1yZWNpcGllbnQtZm9ybSB2MS4xLjBcbiAqIChjKSAyMDI0IFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gdW53cmFwRXhwb3J0cyAoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIEV2ZW50SGFuZGxlcl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBFdmVudEhhbmRsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGVsLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCFlbCB8fCAhZXZlbnQgfHwgIWxpc3RlbmVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2goeyBlbDogZWwsIGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IGxpc3RlbmVyIH0pO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgICB9O1xuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5yZWdpc3RlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgZWwgPSBfYS5lbCwgZXZlbnQgPSBfYS5ldmVudCwgbGlzdGVuZXIgPSBfYS5saXN0ZW5lcjtcbiAgICAgICAgaWYgKCFlbCB8fCAhZXZlbnQgfHwgIWxpc3RlbmVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gdGhpcy5ldmVudHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlbCAhPT0gZS5lbFxuICAgICAgICAgICAgfHwgZXZlbnQgIT09IGUuZXZlbnQgfHwgbGlzdGVuZXIgIT09IGUubGlzdGVuZXI7IH0pO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgICB9O1xuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5yZWdpc3RlckFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IF9hLmVsLCBldmVudCA9IF9hLmV2ZW50LCBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgICAgICAgICAgcmV0dXJuIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRIYW5kbGVyO1xufSgpKTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gRXZlbnRIYW5kbGVyO1xufSk7XG5cbnZhciBFdmVudEhhbmRsZXIgPSB1bndyYXBFeHBvcnRzKEV2ZW50SGFuZGxlcl8xKTtcblxuLyohXG4gICAqIEBwaXhlbHVuaW9uL2FuaW1hdGlvbnMgdjAuMS4wXG4gICAqIChjKSAyMDE5IFBpeGVsIFVuaW9uXG4gICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBVTkxJQ0VOU0VEIGxpY2Vuc2UuXG4gICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBQcm9taXNpZmllZCB2ZXJzaW9uIG9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgY2FsbGJhY2sgaXMgcnVuLlxuICovXG5mdW5jdGlvbiByYWYoKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7XG4gIH0pO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEhUTUwgZWxlbWVudCB3aXRoIGFzc29jaWF0ZSBzdGF0ZXNcbiAqL1xuXG5cbnZhciBBbmltYXRpb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIG9wdGlvbnMuZWwgVGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlPWluaXRpYWxdIEluaXRpYWwgc3RhdGUuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlQXR0cmlidXRlPWRhdGEtcmV2ZWFsZXJdIEF0dHJpYnV0ZSBuYW1lIHRvIHVwZGF0ZSB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlci10cmFuc2l0aW9uXSBBdHRyaWJ1dGUgbmFtZSB0b1xuICAgKiB1cGRhdGUgd2l0aCBjaGFuZ2Ugb2Ygc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5lbmRFdmVudD10cmFuc2l0aW9uZW5kXSBFdmVudCB0byBsaXN0ZW4gZm9yIGF0IGVuZCBvZiBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZD1mYWxzZV0gSWYgdHJ1ZSwgY2hhbmdlQXR0cmlidXRlIHdpbGwgbm90IGJlIHJlbW92ZWQgdW50aWwgdGhlXG4gICAqIG5leHQgc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vblN0YXJ0XSBDYWxsYmFjayB0byBleGVjdXRlIGltbWVkaWF0ZSBhZnRlclxuICAgKiBhcHBseWluZyBzdGF0ZUNoYW5nZUF0dHJpYnV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIEFuaW1hdGlvbihvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGlvbik7XG5cbiAgICB0aGlzLl9lbCA9IG9wdGlvbnMuZWw7XG4gICAgdGhpcy5jYW5jZWxSdW5uaW5nID0gbnVsbDtcbiAgICB0aGlzLl9zdGF0ZSA9IG9wdGlvbnMuc3RhdGUgfHwgJ2luaXRpYWwnO1xuICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgdGhpcy5zdGF0ZUF0dHJpYnV0ZSA9IG9wdGlvbnMuc3RhdGVBdHRyaWJ1dGUgfHwgJ2RhdGEtYW5pbWF0aW9uLXN0YXRlJztcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlID0gb3B0aW9ucy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSB8fCAnZGF0YS1hbmltYXRpb24nO1xuICAgIHRoaXMuZW5kRXZlbnQgPSBvcHRpb25zLmVuZEV2ZW50IHx8ICd0cmFuc2l0aW9uZW5kJztcbiAgICB0aGlzLmhvbGQgPSAhIW9wdGlvbnMuaG9sZDtcblxuICAgIHRoaXMub25TdGFydCA9IG9wdGlvbnMub25TdGFydCB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgfTtcblxuICAgIHRoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0YXJnZXQgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gVGFyZ2V0IGVsZW1lbnRcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0aW9uLCBbe1xuICAgIGtleTogXCJpc1N0YXRlXCIsXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHN0YXRlIGlzIGFjdGl2ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZSBTdGF0ZSB0byBjb21wYXJlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N0YXRlKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGUgPT09IHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXF1ZW5jZXMgYSBjaGFuZ2UgdG8gYSBuZXcgc3RhdGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlIFRhcmdldCBzdGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmZvcmNlIFN3aXRjaCB0byBmaW5hbCBzdGF0ZSBpbW1lZGlhdGVseVxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblN0YXJ0IENhbGxiYWNrIHRvIGV4ZWN1dGUgaW1tZWRpYXRlbHkgYWZ0ZXJcbiAgICAgKiBhcHBseWluZyBzdGF0ZUNoYW5nZUF0dHJpYnV0ZSBmb3IgdGhpcyBzdGF0ZSBjaGFuZ2Ugb25seS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZD1mYWxzZV0gSWYgdHJ1ZSwgY2hhbmdlQXR0cmlidXRlIHdpbGwgbm90IGJlIHJlbW92ZWQgdW50aWwgdGhlXG4gICAgICogbmV4dCBzdGF0ZSBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIGVuZEV2ZW50IHRyaWdnZXJlZFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYW5pbWF0ZVRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFuaW1hdGVUbyhzdGF0ZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIGZyb20gPSB0aGlzLl9lbC5kYXRhc2V0W3RoaXMuc3RhdGVBdHRyaWJ1dGVdIHx8IHRoaXMuX3N0YXRlO1xuICAgICAgdmFyIHRvID0gc3RhdGUgfHwgdGhpcy5pbml0aWFsU3RhdGU7XG4gICAgICB2YXIgZm9yY2UgPSBvcHRpb25zLmZvcmNlO1xuICAgICAgdmFyIGhvbGQgPSAnaG9sZCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuaG9sZCA6IHRoaXMuaG9sZDtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBpZiAoX3RoaXMuY2FuY2VsUnVubmluZykge1xuICAgICAgICAgIF90aGlzLmNhbmNlbFJ1bm5pbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgICAgIC8vIFJlbW92aW5nIHRoaXMgaGVyZSBmaXhlcyBzb21lIGxpbmdlcmluZyBhdHRyaWJ1dGVzLiBCdXQgd2h5P1xuICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShmcm9tLCBudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgX3RoaXMuY2FuY2VsUnVubmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVzb2x2ZShudWxsLCBudWxsKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUsIFwiXCIuY29uY2F0KGZyb20sIFwiPT5cIikuY29uY2F0KHRvKSk7XG5cbiAgICAgICAgICBfdGhpcy5vblN0YXJ0KHtcbiAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25TdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3B0aW9ucy5vblN0YXJ0KHtcbiAgICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQXR0cmlidXRlLCB0byk7XG5cbiAgICAgICAgICBfdGhpcy5fc3RhdGUgPSB0bztcblxuICAgICAgICAgIGlmICghaG9sZCkge1xuICAgICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh0bywgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmFmKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFydW5uaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuXG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSwgXCJcIi5jb25jYXQoZnJvbSwgXCI9PlwiKS5jb25jYXQodG8pKTtcblxuICAgICAgICAgIF90aGlzLm9uU3RhcnQoe1xuICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uU3RhcnQoe1xuICAgICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByYWYoKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFydW5uaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuXG4gICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGFueSBldmVudHMgYnViYmxpbmcgdXBcbiAgICAgICAgICAgIGlmIChlLnRhcmdldCAhPT0gX3RoaXMuX2VsIHx8ICFydW5uaW5nKSByZXR1cm47XG5cbiAgICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgICBpZiAoIWhvbGQpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodG8sIGUpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBfdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVBdHRyaWJ1dGUsIHRvKTtcblxuICAgICAgICAgIF90aGlzLl9zdGF0ZSA9IHRvO1xuICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIC8vIE9ubHkgY2F0Y2ggJ2NhbmNlbGxlZCcgZXJyb3JzLlxuICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSAnY2FuY2VsbGVkJykgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbnkgZXZlbnQgbGlzdGVuZXJzXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmVuZEV2ZW50LCB0aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgIHRoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjdXJyZW50IHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IEN1cnJlbnQgc3RhdGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0YXRlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFuaW1hdGlvbjtcbn0oKTtcblxuZnVuY3Rpb24gdHJhbnNpdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgQW5pbWF0aW9uKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBSZWNpcGllbnRGb3JtIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5yZWNpcGllbnRGb3JtID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNpcGllbnQtZm9ybV0nKTtcbiAgICB0aGlzLnJlY2lwaWVudEZvcm1JbnB1dHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWVtYWlsLWlucHV0XScpO1xuICAgIHRoaXMuZGlzY2xvc3VyZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjaXBpZW50LWRpc2Nsb3N1cmVdJyk7XG4gICAgdGhpcy5kaXNjbG9zdXJlQ2hlY2tib3ggPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1kaXNjbG9zdXJlLWNoZWNrYm94XScpO1xuICAgIHRoaXMuY2hlY2ttYXJrID0gdGhpcy5kaXNjbG9zdXJlLnF1ZXJ5U2VsZWN0b3IoJy5jaGVja21hcmsnKTtcbiAgICB0aGlzLmNoZWNrbWFya0NoZWNrID0gdGhpcy5kaXNjbG9zdXJlLnF1ZXJ5U2VsZWN0b3IoJy5jaGVja21hcmtfX2NoZWNrJyk7XG4gICAgdGhpcy5maWxsQW5pbWF0aW9uID0gdHJhbnNpdGlvbih7XG4gICAgICBlbDogdGhpcy5jaGVja21hcmtcbiAgICB9KTtcbiAgICB0aGlzLmNoZWNrQW5pbWF0aW9uID0gdHJhbnNpdGlvbih7XG4gICAgICBlbDogdGhpcy5jaGVja21hcmtDaGVja1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMucmVjaXBpZW50Rm9ybSwgJ2tleWRvd24nLCBldmVudCA9PiB0aGlzLl9vbktleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmUsICd0b2dnbGUnLCAoKSA9PiB0aGlzLl9vblRvZ2dsZSgpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmVDaGVja2JveCwgJ2NoYW5nZScsICgpID0+IHRoaXMuX29uQ2hhbmdlKCkpO1xuICB9XG5cbiAgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMuZGlzY2xvc3VyZS5vcGVuID0gdGhpcy5kaXNjbG9zdXJlQ2hlY2tib3guY2hlY2tlZDtcbiAgfVxuXG4gIF9vbktleWRvd24oZXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IGlucHV0IGZvcm0gc3VibWlzc2lvblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNjbG9zdXJlLm9wZW4pIHtcbiAgICAgIHRoaXMuX3Nob3dSZWNpcGllbnRGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hpZGVSZWNpcGllbnRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgX3Nob3dSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCdjaGVja2VkJyk7XG4gICAgICB0aGlzLmNoZWNrQW5pbWF0aW9uLmFuaW1hdGVUbygnY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY2xvc3VyZUNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQucmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgX2hpZGVSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICAgIHRoaXMuY2hlY2tBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nsb3N1cmVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNpcGllbnRGb3JtRW1haWxJbnB1dC5yZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVzZXRSZWNpcGllbnRGb3JtKCk7XG4gIH1cblxuICBfcmVzZXRSZWNpcGllbnRGb3JtKCkge1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUlucHV0cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnZhbHVlID0gJyc7XG5cbiAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zvcm0tZmllbGQtZmlsbGVkJykpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9ybS1maWVsZC1maWxsZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlY2lwaWVudEZvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWNpcGllbnQtZm9ybS0taGFzLWVycm9ycycpKSB7XG4gICAgICB0aGlzLnJlY2lwaWVudEZvcm0uY2xhc3NMaXN0LnJlbW92ZSgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWNpcGllbnRGb3JtO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/pxs-map/dist/index.es.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/@pixelunion/pxs-map/dist/index.es.js ***!
+ \***********************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var scriptjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scriptjs */ \"./node_modules/scriptjs/dist/script.js\");\n/* harmony import */ var scriptjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scriptjs__WEBPACK_IMPORTED_MODULE_0__);\n\n/*!\n * @pixelunion/pxs-map v3.2.0\n * (c) 2024 Pixel Union\n */\n\n\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n/*\n * Function to convert any given latitude and longitude format to decimal degrees\n */\nfunction getDecimalDegrees() {\n var firstComponent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var secondComponent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var thirdComponent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var fourthComponent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var directions = {\n N: 1,\n E: 1,\n S: -1,\n W: -1\n };\n var decimalDegrees = 0.0;\n var components = [firstComponent, secondComponent, thirdComponent, fourthComponent];\n\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\n\n if (component) {\n if (Number.isNaN(parseFloat(component))) {\n decimalDegrees *= directions[component];\n } else {\n decimalDegrees += parseFloat(component) / Math.pow(60, i);\n }\n }\n }\n\n return decimalDegrees;\n}\n/*\n * By providing the ability to use a place name, or latitude and longitude coordinates\n * we give merchants, and our demo stores the option to bypass the Geocoding API.\n * The Geocoding API (https://developers.google.com/maps/documentation/geocoding/usage-and-billing) allows us\n * to take a place name and convert it to latitude and longitude expressed in decimal degrees.\n */\n\n\nfunction getLatitudeLongitude(address) {\n // Degrees, Minutes and Seconds: DDD° MM' SS.S\"\n var latLongDegreesMinutesSeconds = /^([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2})(?:'[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:\"[ ]?| )?(N|E|S|W) ?([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2})(?:'[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:\"[ ]?| )?(N|E|S|W)$/g; // Degrees and Decimal Minutes: DDD° MM.MMM'\n\n var latLongDegreesMinutes = /^([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:'[ ]?| )?(N|E|S|W) ?([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:'[ ]?| )?(N|E|S|W)$/g; // Decimal Degrees: DDD.DDDDD°\n\n var latLongDegrees = /^([-|+]?[0-9]{1,3}(?:\\.[0-9]+)?)(?:°[ ]?| )?(N|E|S|W)?,? ?([-|+]?[0-9]{1,3}(?:\\.[0-9]+)?)(?:°[ ]?| )?(N|E|S|W)?$/g;\n var latLongFormats = [latLongDegreesMinutesSeconds, latLongDegreesMinutes, latLongDegrees];\n var latLongMatches = latLongFormats.map(function (latLongFormat) {\n return address.match(latLongFormat);\n });\n /*\n * Select the first latitude and longitude format that is matched.\n * Ordering:\n * 1. Degrees, minutes, and seconds,\n * 2. Degrees, and decimal minutes,\n * 3. Decimal degrees.\n */\n\n var latLongMatch = latLongMatches.reduce(function (accumulator, value, index) {\n if (!accumulator && value) {\n var latLongResult = latLongFormats[index].exec(address);\n var lat = latLongResult.slice(1, latLongResult.length / 2 + 1);\n var lng = latLongResult.slice(latLongResult.length / 2 + 1, latLongResult.length);\n return {\n lat: lat,\n lng: lng\n };\n }\n\n return accumulator;\n }, null);\n return new Promise(function (resolve, reject) {\n // If we've got a match on latitude and longitude, use that and avoid geocoding\n if (latLongMatch) {\n var latDecimalDegrees = getDecimalDegrees.apply(void 0, _toConsumableArray(latLongMatch.lat));\n var longDecimalDegrees = getDecimalDegrees.apply(void 0, _toConsumableArray(latLongMatch.lng));\n resolve({\n lat: latDecimalDegrees,\n lng: longDecimalDegrees\n });\n } else {\n // Otherwise, geocode the assumed address\n var geocoder = new google.maps.Geocoder();\n geocoder.geocode({\n address: address\n }, function (results, status) {\n if (status !== google.maps.GeocoderStatus.OK || !results[0]) {\n reject(status);\n } else {\n resolve(results[0].geometry.location);\n }\n });\n }\n });\n}\n\nfunction getMapStyles(colors) {\n if (!colors) {\n return [];\n }\n\n return [{\n elementType: 'geometry',\n stylers: [{\n color: colors.e\n }]\n }, {\n elementType: 'labels.icon',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n elementType: 'labels.text.fill',\n stylers: [{\n color: colors.a\n }]\n }, {\n elementType: 'labels.text.stroke',\n stylers: [{\n color: colors.e\n }]\n }, {\n featureType: 'administrative',\n elementType: 'geometry',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'administrative.country',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'administrative.land_parcel',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'administrative.neighborhood',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'administrative.locality',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'poi',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'road',\n elementType: 'geometry.fill',\n stylers: [{\n color: colors.d\n }]\n }, {\n featureType: 'road',\n elementType: 'labels.icon',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'road.arterial',\n elementType: 'geometry',\n stylers: [{\n color: colors.c\n }]\n }, {\n featureType: 'road.highway',\n elementType: 'geometry',\n stylers: [{\n color: colors.b\n }]\n }, {\n featureType: 'road.highway.controlled_access',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'road.local',\n elementType: 'labels.text.fill',\n stylers: [{\n color: colors.b\n }]\n }, {\n featureType: 'road.local',\n elementType: 'labels.text.stroke',\n stylers: [{\n color: colors.e\n }]\n }, {\n featureType: 'transit',\n stylers: [{\n visibility: 'off'\n }]\n }, {\n featureType: 'water',\n elementType: 'geometry',\n stylers: [{\n color: colors.f\n }]\n }];\n}\n\nfunction createMap(options) {\n var container = options.container,\n address = options.address,\n zoom = options.zoom,\n colors = options.colors;\n return getLatitudeLongitude(address).then(function (latLong) {\n var map = new google.maps.Map(container, {\n center: latLong,\n clickableIcons: false,\n disableDefaultUI: true,\n disableDoubleClickZoom: true,\n gestureHandling: 'none',\n keyboardShortcuts: false,\n maxZoom: zoom,\n minZoom: zoom,\n scrollWheel: false,\n styles: getMapStyles(colors),\n zoom: zoom,\n zoomControl: false\n });\n new google.maps.Marker({\n clickable: false,\n map: map,\n position: map.getCenter()\n });\n map.panBy(0, 0);\n })[\"catch\"](function (status) {\n var usageLimits = 'https://developers.google.com/maps/faq#usagelimits';\n var errorMessage;\n\n switch (status) {\n case 'ZERO_RESULTS':\n errorMessage = \"<p>Unable to find the address:</p> \".concat(address);\n break;\n\n case 'OVER_QUERY_LIMIT':\n errorMessage = \"\\n <p>Unable to load Google Maps, you have reached your usage limit.</p>\\n <p>\\n Please visit\\n <a href=\\\"\".concat(usageLimits, \"\\\" target=\\\"_blank\\\">\").concat(usageLimits, \"</a>\\n for more details.\\n </p>\\n \");\n break;\n\n default:\n errorMessage = 'Unable to load Google Maps.';\n break;\n }\n\n throw errorMessage;\n });\n}\n\nfunction displayErrorInThemeEditor(container, errorMessage) {\n var isThemeEditor = window.Shopify && window.Shopify.designMode;\n\n if (!isThemeEditor) {\n return;\n }\n\n container.innerHTML = \"<div class=\\\"map-error-message\\\">\".concat(errorMessage, \"</div>\");\n}\n\nvar PxsMap = function PxsMap(section) {\n var _this = this;\n\n _classCallCheck(this, PxsMap);\n\n this.map = null;\n var el = section.el.querySelector('[data-map]');\n var container = el.querySelector('[data-map-container]');\n var settings = section.data;\n var address = settings.address,\n colors = settings.colors;\n var apiKey = settings.api_key; // Scale so range is 12 ~ 17, rather than 1 to 6\n\n var zoom = Number.isNaN(settings.zoom) ? 13 : 11 + parseInt(settings.zoom, 10);\n\n if (apiKey) {\n if (window.googleMaps === undefined) {\n scriptjs__WEBPACK_IMPORTED_MODULE_0___default()(\"https://maps.googleapis.com/maps/api/js?key=\".concat(apiKey), function () {\n window.googleMaps = true;\n createMap({\n container: container,\n address: address,\n zoom: zoom,\n colors: colors\n }).then(function (map) {\n _this.map = map;\n })[\"catch\"](function (error) {\n return displayErrorInThemeEditor(container, error);\n });\n });\n } else {\n createMap({\n container: container,\n address: address,\n zoom: zoom,\n colors: colors\n }).then(function (map) {\n _this.map = map;\n })[\"catch\"](function (error) {\n return displayErrorInThemeEditor(container, error);\n });\n }\n }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PxsMap);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLW1hcC9kaXN0L2luZGV4LmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9weHMtbWFwL2Rpc3QvaW5kZXguZXMuanM/YTViMyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vcHhzLW1hcCB2My4yLjBcbiAqIChjKSAyMDI0IFBpeGVsIFVuaW9uXG4gKi9cblxuaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShuKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBjb252ZXJ0IGFueSBnaXZlbiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGZvcm1hdCB0byBkZWNpbWFsIGRlZ3JlZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVjaW1hbERlZ3JlZXMoKSB7XG4gIHZhciBmaXJzdENvbXBvbmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgdmFyIHNlY29uZENvbXBvbmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIHRoaXJkQ29tcG9uZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuICB2YXIgZm91cnRoQ29tcG9uZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAwO1xuICB2YXIgZGlyZWN0aW9ucyA9IHtcbiAgICBOOiAxLFxuICAgIEU6IDEsXG4gICAgUzogLTEsXG4gICAgVzogLTFcbiAgfTtcbiAgdmFyIGRlY2ltYWxEZWdyZWVzID0gMC4wO1xuICB2YXIgY29tcG9uZW50cyA9IFtmaXJzdENvbXBvbmVudCwgc2Vjb25kQ29tcG9uZW50LCB0aGlyZENvbXBvbmVudCwgZm91cnRoQ29tcG9uZW50XTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcblxuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VGbG9hdChjb21wb25lbnQpKSkge1xuICAgICAgICBkZWNpbWFsRGVncmVlcyAqPSBkaXJlY3Rpb25zW2NvbXBvbmVudF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNpbWFsRGVncmVlcyArPSBwYXJzZUZsb2F0KGNvbXBvbmVudCkgLyBNYXRoLnBvdyg2MCwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY2ltYWxEZWdyZWVzO1xufVxuLypcbiAqIEJ5IHByb3ZpZGluZyB0aGUgYWJpbGl0eSB0byB1c2UgYSBwbGFjZSBuYW1lLCBvciBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzXG4gKiB3ZSBnaXZlIG1lcmNoYW50cywgYW5kIG91ciBkZW1vIHN0b3JlcyB0aGUgb3B0aW9uIHRvIGJ5cGFzcyB0aGUgR2VvY29kaW5nIEFQSS5cbiAqIFRoZSBHZW9jb2RpbmcgQVBJIChodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vZ2VvY29kaW5nL3VzYWdlLWFuZC1iaWxsaW5nKSBhbGxvd3MgdXNcbiAqIHRvIHRha2UgYSBwbGFjZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZXhwcmVzc2VkIGluIGRlY2ltYWwgZGVncmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExhdGl0dWRlTG9uZ2l0dWRlKGFkZHJlc3MpIHtcbiAgLy8gRGVncmVlcywgTWludXRlcyBhbmQgU2Vjb25kczogREREwrAgTU0nIFNTLlNcIlxuICB2YXIgbGF0TG9uZ0RlZ3JlZXNNaW51dGVzU2Vjb25kcyA9IC9eKFswLTldezEsM30pKD86wrBbIF0/fCApKFswLTldezEsMn0pKD86J1sgXT98ICkoWzAtOV17MSwyfSg/OlxcLlswLTldKyk/KSg/OlwiWyBdP3wgKT8oTnxFfFN8VykgPyhbMC05XXsxLDN9KSg/OsKwWyBdP3wgKShbMC05XXsxLDJ9KSg/OidbIF0/fCApKFswLTldezEsMn0oPzpcXC5bMC05XSspPykoPzpcIlsgXT98ICk/KE58RXxTfFcpJC9nOyAvLyBEZWdyZWVzIGFuZCBEZWNpbWFsIE1pbnV0ZXM6IERERMKwIE1NLk1NTSdcblxuICB2YXIgbGF0TG9uZ0RlZ3JlZXNNaW51dGVzID0gL14oWzAtOV17MSwzfSkoPzrCsFsgXT98ICkoWzAtOV17MSwyfSg/OlxcLlswLTldKyk/KSg/OidbIF0/fCApPyhOfEV8U3xXKSA/KFswLTldezEsM30pKD86wrBbIF0/fCApKFswLTldezEsMn0oPzpcXC5bMC05XSspPykoPzonWyBdP3wgKT8oTnxFfFN8VykkL2c7IC8vIERlY2ltYWwgRGVncmVlczogRERELkREREREwrBcblxuICB2YXIgbGF0TG9uZ0RlZ3JlZXMgPSAvXihbLXwrXT9bMC05XXsxLDN9KD86XFwuWzAtOV0rKT8pKD86wrBbIF0/fCApPyhOfEV8U3xXKT8sPyA/KFstfCtdP1swLTldezEsM30oPzpcXC5bMC05XSspPykoPzrCsFsgXT98ICk/KE58RXxTfFcpPyQvZztcbiAgdmFyIGxhdExvbmdGb3JtYXRzID0gW2xhdExvbmdEZWdyZWVzTWludXRlc1NlY29uZHMsIGxhdExvbmdEZWdyZWVzTWludXRlcywgbGF0TG9uZ0RlZ3JlZXNdO1xuICB2YXIgbGF0TG9uZ01hdGNoZXMgPSBsYXRMb25nRm9ybWF0cy5tYXAoZnVuY3Rpb24gKGxhdExvbmdGb3JtYXQpIHtcbiAgICByZXR1cm4gYWRkcmVzcy5tYXRjaChsYXRMb25nRm9ybWF0KTtcbiAgfSk7XG4gIC8qXG4gICAqIFNlbGVjdCB0aGUgZmlyc3QgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBmb3JtYXQgdGhhdCBpcyBtYXRjaGVkLlxuICAgKiBPcmRlcmluZzpcbiAgICogICAxLiBEZWdyZWVzLCBtaW51dGVzLCBhbmQgc2Vjb25kcyxcbiAgICogICAyLiBEZWdyZWVzLCBhbmQgZGVjaW1hbCBtaW51dGVzLFxuICAgKiAgIDMuIERlY2ltYWwgZGVncmVlcy5cbiAgICovXG5cbiAgdmFyIGxhdExvbmdNYXRjaCA9IGxhdExvbmdNYXRjaGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCkge1xuICAgIGlmICghYWNjdW11bGF0b3IgJiYgdmFsdWUpIHtcbiAgICAgIHZhciBsYXRMb25nUmVzdWx0ID0gbGF0TG9uZ0Zvcm1hdHNbaW5kZXhdLmV4ZWMoYWRkcmVzcyk7XG4gICAgICB2YXIgbGF0ID0gbGF0TG9uZ1Jlc3VsdC5zbGljZSgxLCBsYXRMb25nUmVzdWx0Lmxlbmd0aCAvIDIgKyAxKTtcbiAgICAgIHZhciBsbmcgPSBsYXRMb25nUmVzdWx0LnNsaWNlKGxhdExvbmdSZXN1bHQubGVuZ3RoIC8gMiArIDEsIGxhdExvbmdSZXN1bHQubGVuZ3RoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhdDogbGF0LFxuICAgICAgICBsbmc6IGxuZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH0sIG51bGwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIG1hdGNoIG9uIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUsIHVzZSB0aGF0IGFuZCBhdm9pZCBnZW9jb2RpbmdcbiAgICBpZiAobGF0TG9uZ01hdGNoKSB7XG4gICAgICB2YXIgbGF0RGVjaW1hbERlZ3JlZXMgPSBnZXREZWNpbWFsRGVncmVlcy5hcHBseSh2b2lkIDAsIF90b0NvbnN1bWFibGVBcnJheShsYXRMb25nTWF0Y2gubGF0KSk7XG4gICAgICB2YXIgbG9uZ0RlY2ltYWxEZWdyZWVzID0gZ2V0RGVjaW1hbERlZ3JlZXMuYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkobGF0TG9uZ01hdGNoLmxuZykpO1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGxhdDogbGF0RGVjaW1hbERlZ3JlZXMsXG4gICAgICAgIGxuZzogbG9uZ0RlY2ltYWxEZWdyZWVzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW9jb2RlIHRoZSBhc3N1bWVkIGFkZHJlc3NcbiAgICAgIHZhciBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJlc3NcbiAgICAgIH0sIGZ1bmN0aW9uIChyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0sgfHwgIXJlc3VsdHNbMF0pIHtcbiAgICAgICAgICByZWplY3Qoc3RhdHVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRNYXBTdHlsZXMoY29sb3JzKSB7XG4gIGlmICghY29sb3JzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgZWxlbWVudFR5cGU6ICdnZW9tZXRyeScsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIGNvbG9yOiBjb2xvcnMuZVxuICAgIH1dXG4gIH0sIHtcbiAgICBlbGVtZW50VHlwZTogJ2xhYmVscy5pY29uJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgdmlzaWJpbGl0eTogJ29mZidcbiAgICB9XVxuICB9LCB7XG4gICAgZWxlbWVudFR5cGU6ICdsYWJlbHMudGV4dC5maWxsJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgY29sb3I6IGNvbG9ycy5hXG4gICAgfV1cbiAgfSwge1xuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuc3Ryb2tlJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgY29sb3I6IGNvbG9ycy5lXG4gICAgfV1cbiAgfSwge1xuICAgIGZlYXR1cmVUeXBlOiAnYWRtaW5pc3RyYXRpdmUnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmNvdW50cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgdmlzaWJpbGl0eTogJ29mZidcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdhZG1pbmlzdHJhdGl2ZS5uZWlnaGJvcmhvb2QnLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmxvY2FsaXR5JyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgdmlzaWJpbGl0eTogJ29mZidcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdwb2knLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnkuZmlsbCcsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIGNvbG9yOiBjb2xvcnMuZFxuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLmljb24nLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQuYXJ0ZXJpYWwnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICBjb2xvcjogY29sb3JzLmNcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdyb2FkLmhpZ2h3YXknLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICBjb2xvcjogY29sb3JzLmJcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdyb2FkLmhpZ2h3YXkuY29udHJvbGxlZF9hY2Nlc3MnLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQubG9jYWwnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuZmlsbCcsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIGNvbG9yOiBjb2xvcnMuYlxuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQubG9jYWwnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuc3Ryb2tlJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgY29sb3I6IGNvbG9ycy5lXG4gICAgfV1cbiAgfSwge1xuICAgIGZlYXR1cmVUeXBlOiAndHJhbnNpdCcsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIHZpc2liaWxpdHk6ICdvZmYnXG4gICAgfV1cbiAgfSwge1xuICAgIGZlYXR1cmVUeXBlOiAnd2F0ZXInLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICBjb2xvcjogY29sb3JzLmZcbiAgICB9XVxuICB9XTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFwKG9wdGlvbnMpIHtcbiAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyLFxuICAgICAgYWRkcmVzcyA9IG9wdGlvbnMuYWRkcmVzcyxcbiAgICAgIHpvb20gPSBvcHRpb25zLnpvb20sXG4gICAgICBjb2xvcnMgPSBvcHRpb25zLmNvbG9ycztcbiAgcmV0dXJuIGdldExhdGl0dWRlTG9uZ2l0dWRlKGFkZHJlc3MpLnRoZW4oZnVuY3Rpb24gKGxhdExvbmcpIHtcbiAgICB2YXIgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChjb250YWluZXIsIHtcbiAgICAgIGNlbnRlcjogbGF0TG9uZyxcbiAgICAgIGNsaWNrYWJsZUljb25zOiBmYWxzZSxcbiAgICAgIGRpc2FibGVEZWZhdWx0VUk6IHRydWUsXG4gICAgICBkaXNhYmxlRG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICAgICAgZ2VzdHVyZUhhbmRsaW5nOiAnbm9uZScsXG4gICAgICBrZXlib2FyZFNob3J0Y3V0czogZmFsc2UsXG4gICAgICBtYXhab29tOiB6b29tLFxuICAgICAgbWluWm9vbTogem9vbSxcbiAgICAgIHNjcm9sbFdoZWVsOiBmYWxzZSxcbiAgICAgIHN0eWxlczogZ2V0TWFwU3R5bGVzKGNvbG9ycyksXG4gICAgICB6b29tOiB6b29tLFxuICAgICAgem9vbUNvbnRyb2w6IGZhbHNlXG4gICAgfSk7XG4gICAgbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICBjbGlja2FibGU6IGZhbHNlLFxuICAgICAgbWFwOiBtYXAsXG4gICAgICBwb3NpdGlvbjogbWFwLmdldENlbnRlcigpXG4gICAgfSk7XG4gICAgbWFwLnBhbkJ5KDAsIDApO1xuICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICB2YXIgdXNhZ2VMaW1pdHMgPSAnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9mYXEjdXNhZ2VsaW1pdHMnO1xuICAgIHZhciBlcnJvck1lc3NhZ2U7XG5cbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAnWkVST19SRVNVTFRTJzpcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gXCI8cD5VbmFibGUgdG8gZmluZCB0aGUgYWRkcmVzczo8L3A+IFwiLmNvbmNhdChhZGRyZXNzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ09WRVJfUVVFUllfTElNSVQnOlxuICAgICAgICBlcnJvck1lc3NhZ2UgPSBcIlxcbiAgICAgICAgICAgIDxwPlVuYWJsZSB0byBsb2FkIEdvb2dsZSBNYXBzLCB5b3UgaGF2ZSByZWFjaGVkIHlvdXIgdXNhZ2UgbGltaXQuPC9wPlxcbiAgICAgICAgICAgIDxwPlxcbiAgICAgICAgICAgICAgUGxlYXNlIHZpc2l0XFxuICAgICAgICAgICAgICA8YSBocmVmPVxcXCJcIi5jb25jYXQodXNhZ2VMaW1pdHMsIFwiXFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+XCIpLmNvbmNhdCh1c2FnZUxpbWl0cywgXCI8L2E+XFxuICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLlxcbiAgICAgICAgICAgIDwvcD5cXG4gICAgICAgICAgXCIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1VuYWJsZSB0byBsb2FkIEdvb2dsZSBNYXBzLic7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yTWVzc2FnZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlFcnJvckluVGhlbWVFZGl0b3IoY29udGFpbmVyLCBlcnJvck1lc3NhZ2UpIHtcbiAgdmFyIGlzVGhlbWVFZGl0b3IgPSB3aW5kb3cuU2hvcGlmeSAmJiB3aW5kb3cuU2hvcGlmeS5kZXNpZ25Nb2RlO1xuXG4gIGlmICghaXNUaGVtZUVkaXRvcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIjxkaXYgY2xhc3M9XFxcIm1hcC1lcnJvci1tZXNzYWdlXFxcIj5cIi5jb25jYXQoZXJyb3JNZXNzYWdlLCBcIjwvZGl2PlwiKTtcbn1cblxudmFyIFB4c01hcCA9IGZ1bmN0aW9uIFB4c01hcChzZWN0aW9uKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB4c01hcCk7XG5cbiAgdGhpcy5tYXAgPSBudWxsO1xuICB2YXIgZWwgPSBzZWN0aW9uLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hcF0nKTtcbiAgdmFyIGNvbnRhaW5lciA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hcC1jb250YWluZXJdJyk7XG4gIHZhciBzZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgdmFyIGFkZHJlc3MgPSBzZXR0aW5ncy5hZGRyZXNzLFxuICAgICAgY29sb3JzID0gc2V0dGluZ3MuY29sb3JzO1xuICB2YXIgYXBpS2V5ID0gc2V0dGluZ3MuYXBpX2tleTsgLy8gU2NhbGUgc28gcmFuZ2UgaXMgMTIgfiAxNywgcmF0aGVyIHRoYW4gMSB0byA2XG5cbiAgdmFyIHpvb20gPSBOdW1iZXIuaXNOYU4oc2V0dGluZ3Muem9vbSkgPyAxMyA6IDExICsgcGFyc2VJbnQoc2V0dGluZ3Muem9vbSwgMTApO1xuXG4gIGlmIChhcGlLZXkpIHtcbiAgICBpZiAod2luZG93Lmdvb2dsZU1hcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgJHNjcmlwdChcImh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9XCIuY29uY2F0KGFwaUtleSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93Lmdvb2dsZU1hcHMgPSB0cnVlO1xuICAgICAgICBjcmVhdGVNYXAoe1xuICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgICBjb2xvcnM6IGNvbG9yc1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICBfdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRpc3BsYXlFcnJvckluVGhlbWVFZGl0b3IoY29udGFpbmVyLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWF0ZU1hcCh7XG4gICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBjb2xvcnM6IGNvbG9yc1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIF90aGlzLm1hcCA9IG1hcDtcbiAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkaXNwbGF5RXJyb3JJblRoZW1lRWRpdG9yKGNvbnRhaW5lciwgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQeHNNYXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-map/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/pxs-video/dist/index.es.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/@pixelunion/pxs-video/dist/index.es.js ***!
+ \*************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/pxs-video v2.0.0\n * (c) 2023 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar script = createCommonjsModule(function (module) {\n/*!\n * $script.js JS loader & dependency manager\n * https://github.com/ded/script.js\n * (c) Dustin Diaz 2014 | License MIT\n */\n\n(function (name, definition) {\n if ( module.exports) module.exports = definition();\n else this[name] = definition();\n})('$script', function () {\n var doc = document\n , head = doc.getElementsByTagName('head')[0]\n , f = false\n , push = 'push'\n , readyState = 'readyState'\n , onreadystatechange = 'onreadystatechange'\n , list = {}\n , delay = {}\n , scripts = {}\n , scriptpath\n , urlArgs;\n\n function every(ar, fn) {\n for (var i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f\n return 1\n }\n function each(ar, fn) {\n every(ar, function (el) {\n fn(el);\n return 1\n });\n }\n\n function $script(paths, idOrDone, optDone) {\n paths = paths[push] ? paths : [paths];\n var idOrDoneIsDone = idOrDone && idOrDone.call\n , done = idOrDoneIsDone ? idOrDone : optDone\n , id = idOrDoneIsDone ? paths.join('') : idOrDone\n , queue = paths.length;\n function loopFn(item) {\n return item.call ? item() : list[item]\n }\n function callback() {\n if (!--queue) {\n list[id] = 1;\n done && done();\n for (var dset in delay) {\n every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = []);\n }\n }\n }\n setTimeout(function () {\n each(paths, function loading(path, force) {\n if (path === null) return callback()\n \n if (!force && !/^https?:\\/\\//.test(path) && scriptpath) {\n path = (path.indexOf('.js') === -1) ? scriptpath + path + '.js' : scriptpath + path;\n }\n \n if (scripts[path]) {\n return (scripts[path] == 2) ? callback() : setTimeout(function () { loading(path, true); }, 0)\n }\n\n scripts[path] = 1;\n create(path, callback);\n });\n }, 0);\n return $script\n }\n\n function create(path, fn) {\n var el = doc.createElement('script'), loaded;\n el.onload = el.onerror = el[onreadystatechange] = function () {\n if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) return;\n el.onload = el[onreadystatechange] = null;\n loaded = 1;\n scripts[path] = 2;\n fn();\n };\n el.async = 1;\n el.src = urlArgs ? path + (path.indexOf('?') === -1 ? '?' : '&') + urlArgs : path;\n head.insertBefore(el, head.lastChild);\n }\n\n $script.get = create;\n\n $script.order = function (scripts, id, done) {\n (function callback(s) {\n s = scripts.shift();\n !scripts.length ? $script(s, id, done) : $script(s, callback);\n }());\n };\n\n $script.path = function (p) {\n scriptpath = p;\n };\n $script.urlArgs = function (str) {\n urlArgs = str;\n };\n $script.ready = function (deps, ready, req) {\n deps = deps[push] ? deps : [deps];\n var missing = [];\n !each(deps, function (dep) {\n list[dep] || missing[push](dep);\n }) && every(deps, function (dep) {return list[dep]}) ?\n ready() : !function (key) {\n delay[key] = delay[key] || [];\n delay[key][push](ready);\n req && req(missing);\n }(deps.join('|'));\n return $script\n };\n\n $script.done = function (idOrDone) {\n $script([null], idOrDone);\n };\n\n return $script\n});\n});\n\nvar api = 'https://www.youtube.com/iframe_api';\nvar apiLoadedCallbacks = [];\nvar apiLoaded = false;\n\nwindow.onYouTubeIframeAPIReady = function () {\n apiLoadedCallbacks.forEach(function (apiLoadedCallback) {\n return apiLoadedCallback();\n });\n apiLoadedCallbacks = [];\n apiLoaded = true;\n};\n\nvar Youtube = /*#__PURE__*/function () {\n function Youtube(el, id, options) {\n _classCallCheck(this, Youtube);\n\n this.el = el;\n this.id = id;\n this.startMuted = options.startMuted;\n this.loopVideo = options.loopVideo;\n this.iframeEl = document.createElement('div');\n this.el.appendChild(this.iframeEl);\n this.onApiLoaded = this._onApiLoaded.bind(this);\n this.isReady = false;\n this.onReady = this._onReady.bind(this);\n this.onReadyCallback = null;\n this.playerState = null;\n this.onStateChange = this._onStateChange.bind(this);\n this.onPlayCallback = null;\n this.onPlayError = null;\n\n if (apiLoaded) {\n this._onApiLoaded();\n } else {\n apiLoadedCallbacks.push(this.onApiLoaded);\n script(api);\n }\n }\n\n _createClass(Youtube, [{\n key: \"play\",\n value: function play() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.onPlayCallback = resolve;\n _this.onPlayError = reject;\n\n if (_this.isReady) {\n _this.player.playVideo();\n } else {\n _this.onReadyCallback = function () {\n _this.player.playVideo();\n };\n }\n });\n }\n }, {\n key: \"pause\",\n value: function pause() {\n this.player.pauseVideo();\n }\n }, {\n key: \"unload\",\n value: function unload() {\n this.player.destroy();\n }\n }, {\n key: \"_onApiLoaded\",\n value: function _onApiLoaded() {\n var playerVars = {\n modestbranding: true,\n showinfo: false,\n controls: false,\n loop: this.loopVideo,\n mute: this.startMuted,\n rel: 0\n };\n\n if (this.loopVideo) {\n // This is required to allow 'loop' to work based on the YouTube api\n playerVars.playlist = this.id;\n }\n\n this.player = new YT.Player(this.iframeEl, {\n videoId: this.id,\n playerVars: playerVars,\n events: {\n onReady: this.onReady,\n onStateChange: this.onStateChange\n }\n });\n }\n }, {\n key: \"_onReady\",\n value: function _onReady() {\n this.isReady = true;\n\n if (this.onReadyCallback) {\n this.onReadyCallback();\n }\n }\n }, {\n key: \"_onStateChange\",\n value: function _onStateChange(event) {\n var state = event.data;\n\n if (this.onPlayCallback) {\n if (state === YT.PlayerState.PLAYING) {\n this.onPlayCallback();\n this.onPlayCallback = null;\n this.onPlayError = null;\n } else if (this.playerState === YT.PlayerState.BUFFERING && (state === YT.PlayerState.UNSTARTED || state === YT.PlayerState.PAUSED)) {\n this.onPlayError();\n this.onPlayCallback = null;\n this.onPlayError = null;\n }\n }\n\n this.playerState = state;\n }\n }]);\n\n return Youtube;\n}();\n\nvar api$1 = 'https://player.vimeo.com/api/player.js';\nvar thumbnailApi = 'http://vimeo.com/api/v2/video/{id}.json';\nvar apiLoaded$1 = false;\n\nvar VimeoPlayer = /*#__PURE__*/function () {\n function VimeoPlayer(section, el, id, options) {\n var _this = this;\n\n _classCallCheck(this, VimeoPlayer);\n\n this.section = section;\n this.el = el;\n this.id = id;\n this.startMuted = options.startMuted;\n this.loopVideo = options.loopVideo;\n this.coverImage = this.section.querySelector('[data-vimeo-image]');\n this.onApiLoaded = this._onApiLoaded.bind(this);\n this.isReady = false;\n this.onReady = this._onReady.bind(this);\n this.onReadyCallback = null;\n this.onPlayCallback = null;\n this.startedPlaying = false;\n this.onProgress = this._onProgress.bind(this);\n\n if (apiLoaded$1) {\n this._onApiLoaded();\n } else {\n script(api$1, this.onApiLoaded);\n }\n\n if (this.coverImage) {\n // Add the cover image for vimeo videos\n fetch(thumbnailApi.replace('{id}', this.id)).then(function (response) {\n return response.json();\n }).then(function (data) {\n _this.coverImage.setAttribute('src', data[0].thumbnail_large);\n });\n }\n }\n\n _createClass(VimeoPlayer, [{\n key: \"play\",\n value: function play() {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n _this2.onPlayCallback = resolve;\n _this2.onPlayError = reject;\n\n if (_this2.isReady) {\n _this2.player.play().then(function () {\n _this2.player.on('progress', _this2.onProgress);\n })[\"catch\"](function (error) {\n _this2.player.off('progress', _this2.onProgress);\n\n _this2.onPlayError();\n });\n } else {\n _this2.onReadyCallback = function () {\n _this2.player.play().then(function () {\n _this2.player.on('progress', _this2.onProgress);\n })[\"catch\"](function (error) {\n _this2.player.off('progress', _this2.onProgress);\n\n _this2.onPlayError();\n });\n };\n }\n });\n }\n }, {\n key: \"pause\",\n value: function pause() {\n this.player.pause()[\"catch\"]();\n }\n }, {\n key: \"unload\",\n value: function unload() {\n this.player.unload()[\"catch\"]();\n }\n }, {\n key: \"_onApiLoaded\",\n value: function _onApiLoaded() {\n var _this3 = this;\n\n this.player = new window.Vimeo.Player(this.el, {\n id: this.id,\n muted: this.startMuted,\n loop: this.loopVideo\n });\n this.player.ready().then(function () {\n _this3._onReady();\n })[\"catch\"](function () {\n _this3.onPlayError();\n });\n apiLoaded$1 = true;\n }\n }, {\n key: \"_onReady\",\n value: function _onReady() {\n this.isReady = true;\n\n if (this.onReadyCallback) {\n this.onReadyCallback();\n }\n }\n }, {\n key: \"_onProgress\",\n value: function _onProgress() {\n this.startedPlaying = true;\n this.player.off('progress', this.onProgress);\n\n if (this.onPlayCallback) {\n this.onPlayCallback();\n this.onPlayCallback = null;\n }\n }\n }]);\n\n return VimeoPlayer;\n}();\n\nvar loadPlyrStyles = null;\n\nvar HTML5Video = /*#__PURE__*/function () {\n function HTML5Video(section, el, options) {\n var _this = this;\n\n _classCallCheck(this, HTML5Video);\n\n this.section = section;\n this.videoElement = el.querySelector('[data-html5-video]');\n this.startMuted = options.startMuted;\n this.loopVideo = options.loopVideo;\n this.aspectRatio = options.aspectRatio;\n this.setupVideo = this.setupVideo.bind(this);\n this.play = this.play.bind(this);\n this.pause = this.pause.bind(this);\n this.unload = this.unload.bind(this);\n\n if (!(loadPlyrStyles instanceof Promise)) {\n loadPlyrStyles = new Promise(function (resolve) {\n var stylesheet = document.createElement('link');\n stylesheet.setAttribute('rel', 'stylesheet');\n stylesheet.href = 'https://cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css';\n stylesheet.onload = resolve;\n document.body.appendChild(stylesheet);\n });\n }\n\n window.Shopify.loadFeatures([{\n name: 'video-ui',\n version: '1.0',\n onLoad: function onLoad() {\n return loadPlyrStyles.then(function () {\n return _this.setupVideo();\n });\n }\n }]);\n }\n\n _createClass(HTML5Video, [{\n key: \"setupVideo\",\n value: function setupVideo() {\n if (!Shopify.Plyr) {\n return;\n }\n\n this.player = new Shopify.Plyr(this.videoElement, {\n muted: this.startMuted,\n loop: {\n active: this.loopVideo\n },\n ratio: this.aspectRatio\n });\n }\n }, {\n key: \"play\",\n value: function play() {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n if (_this2.player) {\n _this2.player.play();\n\n resolve();\n }\n });\n }\n }, {\n key: \"pause\",\n value: function pause() {\n this.player.pause();\n }\n }, {\n key: \"unload\",\n value: function unload() {\n if (this.player) {\n this.player.destroy();\n }\n }\n }]);\n\n return HTML5Video;\n}();\n\nvar Video = /*#__PURE__*/function () {\n function Video(section) {\n var _this = this;\n\n _classCallCheck(this, Video);\n\n this.el = section.el;\n this.settings = section.data;\n this.playButton = this.el.querySelector('[data-video-play-button]');\n this.videoEl = this.el.querySelector('[data-video]');\n this.video = null;\n this.playButtonClicked = false;\n var autoplay = this.settings.autoplay || false;\n var startMuted = this.settings.startMuted != null ? this.settings.startMuted : true;\n var loopVideo = this.settings.loopVideo || false;\n var aspectRatio = this.settings.aspectRatio;\n var type = this.videoEl.getAttribute('data-video');\n var id = this.videoEl.getAttribute('data-video-id');\n\n switch (type) {\n case 'youtube':\n this.video = new Youtube(this.videoEl, id, {\n startMuted: startMuted,\n loopVideo: loopVideo\n });\n break;\n\n case 'vimeo':\n this.video = new VimeoPlayer(this.el, this.videoEl, id, {\n startMuted: startMuted,\n loopVideo: loopVideo\n });\n break;\n\n case 'html5':\n this.video = new HTML5Video(this.el, this.videoEl, {\n startMuted: startMuted,\n loopVideo: loopVideo,\n aspectRatio: aspectRatio\n });\n break;\n\n default:\n this.video = null;\n break;\n }\n\n this._play = this._play.bind(this);\n\n if (this.playButton) {\n this.onPlayButtonClick = function () {\n _this.playButtonClicked = true;\n\n _this._play();\n };\n\n this.playButton.addEventListener('click', this.onPlayButtonClick);\n }\n\n if (!this.viewportIsMobile() && autoplay) {\n // Set up autoplay for when the video is in the viewport\n this.observer = new IntersectionObserver(function (entries) {\n var isIntersecting = entries[0].isIntersecting;\n\n if (isIntersecting) {\n _this._play();\n\n _this.observer.unobserve(_this.videoEl);\n }\n });\n this.observer.observe(this.videoEl);\n }\n }\n\n _createClass(Video, [{\n key: \"_play\",\n value: function _play() {\n var _this2 = this;\n\n this.el.dataset.videoLoading = true;\n this.video.play().then(function () {\n _this2.el.dataset.videoTransitioning = true;\n setTimeout(function () {\n _this2.el.dataset.videoLoading = false;\n _this2.el.dataset.videoTransitioning = false;\n _this2.el.dataset.videoPlaying = true; // This is for accessibility, the video should receive focus after playing.\n\n if (_this2.playButtonClicked) {\n _this2.videoEl.focus();\n }\n }, 200);\n })[\"catch\"](function () {\n // We should pause the video in case it does start\n // playing underneath the overlay\n _this2.video.pause();\n\n _this2.el.dataset.videoLoading = false;\n _this2.el.dataset.videoPlaying = false;\n });\n } // This method can be overridden by the theme if the breakpoint is different than 720.\n\n }, {\n key: \"viewportIsMobile\",\n value: function viewportIsMobile() {\n return window.innerWidth < 720;\n }\n }, {\n key: \"onSectionUnload\",\n value: function onSectionUnload() {\n if (this.playButton) {\n this.playButton.removeEventListener('click', this.onPlayClick);\n }\n\n if (this.video) {\n this.video.unload();\n }\n }\n }]);\n\n return Video;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Video);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLXZpZGVvL2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3B4cy12aWRlby9kaXN0L2luZGV4LmVzLmpzP2RjYWUiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKiFcbiAqIEBwaXhlbHVuaW9uL3B4cy12aWRlbyB2Mi4wLjBcbiAqIChjKSAyMDIzIFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIHNjcmlwdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8qIVxuICAqICRzY3JpcHQuanMgSlMgbG9hZGVyICYgZGVwZW5kZW5jeSBtYW5hZ2VyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2RlZC9zY3JpcHQuanNcbiAgKiAoYykgRHVzdGluIERpYXogMjAxNCB8IExpY2Vuc2UgTUlUXG4gICovXG5cbihmdW5jdGlvbiAobmFtZSwgZGVmaW5pdGlvbikge1xuICBpZiAoIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKTtcbiAgZWxzZSB0aGlzW25hbWVdID0gZGVmaW5pdGlvbigpO1xufSkoJyRzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBkb2MgPSBkb2N1bWVudFxuICAgICwgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gICAgLCBmID0gZmFsc2VcbiAgICAsIHB1c2ggPSAncHVzaCdcbiAgICAsIHJlYWR5U3RhdGUgPSAncmVhZHlTdGF0ZSdcbiAgICAsIG9ucmVhZHlzdGF0ZWNoYW5nZSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICAgLCBsaXN0ID0ge31cbiAgICAsIGRlbGF5ID0ge31cbiAgICAsIHNjcmlwdHMgPSB7fVxuICAgICwgc2NyaXB0cGF0aFxuICAgICwgdXJsQXJncztcblxuICBmdW5jdGlvbiBldmVyeShhciwgZm4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFyLmxlbmd0aDsgaSA8IGo7ICsraSkgaWYgKCFmbihhcltpXSkpIHJldHVybiBmXG4gICAgcmV0dXJuIDFcbiAgfVxuICBmdW5jdGlvbiBlYWNoKGFyLCBmbikge1xuICAgIGV2ZXJ5KGFyLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGZuKGVsKTtcbiAgICAgIHJldHVybiAxXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiAkc2NyaXB0KHBhdGhzLCBpZE9yRG9uZSwgb3B0RG9uZSkge1xuICAgIHBhdGhzID0gcGF0aHNbcHVzaF0gPyBwYXRocyA6IFtwYXRoc107XG4gICAgdmFyIGlkT3JEb25lSXNEb25lID0gaWRPckRvbmUgJiYgaWRPckRvbmUuY2FsbFxuICAgICAgLCBkb25lID0gaWRPckRvbmVJc0RvbmUgPyBpZE9yRG9uZSA6IG9wdERvbmVcbiAgICAgICwgaWQgPSBpZE9yRG9uZUlzRG9uZSA/IHBhdGhzLmpvaW4oJycpIDogaWRPckRvbmVcbiAgICAgICwgcXVldWUgPSBwYXRocy5sZW5ndGg7XG4gICAgZnVuY3Rpb24gbG9vcEZuKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmNhbGwgPyBpdGVtKCkgOiBsaXN0W2l0ZW1dXG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgaWYgKCEtLXF1ZXVlKSB7XG4gICAgICAgIGxpc3RbaWRdID0gMTtcbiAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgIGZvciAodmFyIGRzZXQgaW4gZGVsYXkpIHtcbiAgICAgICAgICBldmVyeShkc2V0LnNwbGl0KCd8JyksIGxvb3BGbikgJiYgIWVhY2goZGVsYXlbZHNldF0sIGxvb3BGbikgJiYgKGRlbGF5W2RzZXRdID0gW10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZWFjaChwYXRocywgZnVuY3Rpb24gbG9hZGluZyhwYXRoLCBmb3JjZSkge1xuICAgICAgICBpZiAocGF0aCA9PT0gbnVsbCkgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9yY2UgJiYgIS9eaHR0cHM/OlxcL1xcLy8udGVzdChwYXRoKSAmJiBzY3JpcHRwYXRoKSB7XG4gICAgICAgICAgcGF0aCA9IChwYXRoLmluZGV4T2YoJy5qcycpID09PSAtMSkgPyBzY3JpcHRwYXRoICsgcGF0aCArICcuanMnIDogc2NyaXB0cGF0aCArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChzY3JpcHRzW3BhdGhdKSB7XG4gICAgICAgICAgcmV0dXJuIChzY3JpcHRzW3BhdGhdID09IDIpID8gY2FsbGJhY2soKSA6IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBsb2FkaW5nKHBhdGgsIHRydWUpOyB9LCAwKVxuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0c1twYXRoXSA9IDE7XG4gICAgICAgIGNyZWF0ZShwYXRoLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gJHNjcmlwdFxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlKHBhdGgsIGZuKSB7XG4gICAgdmFyIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBsb2FkZWQ7XG4gICAgZWwub25sb2FkID0gZWwub25lcnJvciA9IGVsW29ucmVhZHlzdGF0ZWNoYW5nZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoKGVsW3JlYWR5U3RhdGVdICYmICEoL15jfGxvYWRlLy50ZXN0KGVsW3JlYWR5U3RhdGVdKSkpIHx8IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgZWwub25sb2FkID0gZWxbb25yZWFkeXN0YXRlY2hhbmdlXSA9IG51bGw7XG4gICAgICBsb2FkZWQgPSAxO1xuICAgICAgc2NyaXB0c1twYXRoXSA9IDI7XG4gICAgICBmbigpO1xuICAgIH07XG4gICAgZWwuYXN5bmMgPSAxO1xuICAgIGVsLnNyYyA9IHVybEFyZ3MgPyBwYXRoICsgKHBhdGguaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzIDogcGF0aDtcbiAgICBoZWFkLmluc2VydEJlZm9yZShlbCwgaGVhZC5sYXN0Q2hpbGQpO1xuICB9XG5cbiAgJHNjcmlwdC5nZXQgPSBjcmVhdGU7XG5cbiAgJHNjcmlwdC5vcmRlciA9IGZ1bmN0aW9uIChzY3JpcHRzLCBpZCwgZG9uZSkge1xuICAgIChmdW5jdGlvbiBjYWxsYmFjayhzKSB7XG4gICAgICBzID0gc2NyaXB0cy5zaGlmdCgpO1xuICAgICAgIXNjcmlwdHMubGVuZ3RoID8gJHNjcmlwdChzLCBpZCwgZG9uZSkgOiAkc2NyaXB0KHMsIGNhbGxiYWNrKTtcbiAgICB9KCkpO1xuICB9O1xuXG4gICRzY3JpcHQucGF0aCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgc2NyaXB0cGF0aCA9IHA7XG4gIH07XG4gICRzY3JpcHQudXJsQXJncyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB1cmxBcmdzID0gc3RyO1xuICB9O1xuICAkc2NyaXB0LnJlYWR5ID0gZnVuY3Rpb24gKGRlcHMsIHJlYWR5LCByZXEpIHtcbiAgICBkZXBzID0gZGVwc1twdXNoXSA/IGRlcHMgOiBbZGVwc107XG4gICAgdmFyIG1pc3NpbmcgPSBbXTtcbiAgICAhZWFjaChkZXBzLCBmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBsaXN0W2RlcF0gfHwgbWlzc2luZ1twdXNoXShkZXApO1xuICAgIH0pICYmIGV2ZXJ5KGRlcHMsIGZ1bmN0aW9uIChkZXApIHtyZXR1cm4gbGlzdFtkZXBdfSkgP1xuICAgICAgcmVhZHkoKSA6ICFmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWxheVtrZXldID0gZGVsYXlba2V5XSB8fCBbXTtcbiAgICAgIGRlbGF5W2tleV1bcHVzaF0ocmVhZHkpO1xuICAgICAgcmVxICYmIHJlcShtaXNzaW5nKTtcbiAgICB9KGRlcHMuam9pbignfCcpKTtcbiAgICByZXR1cm4gJHNjcmlwdFxuICB9O1xuXG4gICRzY3JpcHQuZG9uZSA9IGZ1bmN0aW9uIChpZE9yRG9uZSkge1xuICAgICRzY3JpcHQoW251bGxdLCBpZE9yRG9uZSk7XG4gIH07XG5cbiAgcmV0dXJuICRzY3JpcHRcbn0pO1xufSk7XG5cbnZhciBhcGkgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XG52YXIgYXBpTG9hZGVkQ2FsbGJhY2tzID0gW107XG52YXIgYXBpTG9hZGVkID0gZmFsc2U7XG5cbndpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgYXBpTG9hZGVkQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGFwaUxvYWRlZENhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGFwaUxvYWRlZENhbGxiYWNrKCk7XG4gIH0pO1xuICBhcGlMb2FkZWRDYWxsYmFja3MgPSBbXTtcbiAgYXBpTG9hZGVkID0gdHJ1ZTtcbn07XG5cbnZhciBZb3V0dWJlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWW91dHViZShlbCwgaWQsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWW91dHViZSk7XG5cbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc3RhcnRNdXRlZCA9IG9wdGlvbnMuc3RhcnRNdXRlZDtcbiAgICB0aGlzLmxvb3BWaWRlbyA9IG9wdGlvbnMubG9vcFZpZGVvO1xuICAgIHRoaXMuaWZyYW1lRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lRWwpO1xuICAgIHRoaXMub25BcGlMb2FkZWQgPSB0aGlzLl9vbkFwaUxvYWRlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMub25SZWFkeSA9IHRoaXMuX29uUmVhZHkuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uUmVhZHlDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gdGhpcy5fb25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25QbGF5Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMub25QbGF5RXJyb3IgPSBudWxsO1xuXG4gICAgaWYgKGFwaUxvYWRlZCkge1xuICAgICAgdGhpcy5fb25BcGlMb2FkZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpTG9hZGVkQ2FsbGJhY2tzLnB1c2godGhpcy5vbkFwaUxvYWRlZCk7XG4gICAgICBzY3JpcHQoYXBpKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoWW91dHViZSwgW3tcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgX3RoaXMub25QbGF5Q2FsbGJhY2sgPSByZXNvbHZlO1xuICAgICAgICBfdGhpcy5vblBsYXlFcnJvciA9IHJlamVjdDtcblxuICAgICAgICBpZiAoX3RoaXMuaXNSZWFkeSkge1xuICAgICAgICAgIF90aGlzLnBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5vblJlYWR5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5wbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5wbGF5ZXIucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5wbGF5ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25BcGlMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uQXBpTG9hZGVkKCkge1xuICAgICAgdmFyIHBsYXllclZhcnMgPSB7XG4gICAgICAgIG1vZGVzdGJyYW5kaW5nOiB0cnVlLFxuICAgICAgICBzaG93aW5mbzogZmFsc2UsXG4gICAgICAgIGNvbnRyb2xzOiBmYWxzZSxcbiAgICAgICAgbG9vcDogdGhpcy5sb29wVmlkZW8sXG4gICAgICAgIG11dGU6IHRoaXMuc3RhcnRNdXRlZCxcbiAgICAgICAgcmVsOiAwXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5sb29wVmlkZW8pIHtcbiAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCB0byBhbGxvdyAnbG9vcCcgdG8gd29yayBiYXNlZCBvbiB0aGUgWW91VHViZSBhcGlcbiAgICAgICAgcGxheWVyVmFycy5wbGF5bGlzdCA9IHRoaXMuaWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IFlULlBsYXllcih0aGlzLmlmcmFtZUVsLCB7XG4gICAgICAgIHZpZGVvSWQ6IHRoaXMuaWQsXG4gICAgICAgIHBsYXllclZhcnM6IHBsYXllclZhcnMsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIG9uUmVhZHk6IHRoaXMub25SZWFkeSxcbiAgICAgICAgICBvblN0YXRlQ2hhbmdlOiB0aGlzLm9uU3RhdGVDaGFuZ2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblJlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblJlYWR5KCkge1xuICAgICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblN0YXRlQ2hhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblN0YXRlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBldmVudC5kYXRhO1xuXG4gICAgICBpZiAodGhpcy5vblBsYXlDYWxsYmFjaykge1xuICAgICAgICBpZiAoc3RhdGUgPT09IFlULlBsYXllclN0YXRlLlBMQVlJTkcpIHtcbiAgICAgICAgICB0aGlzLm9uUGxheUNhbGxiYWNrKCk7XG4gICAgICAgICAgdGhpcy5vblBsYXlDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblBsYXlFcnJvciA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gWVQuUGxheWVyU3RhdGUuQlVGRkVSSU5HICYmIChzdGF0ZSA9PT0gWVQuUGxheWVyU3RhdGUuVU5TVEFSVEVEIHx8IHN0YXRlID09PSBZVC5QbGF5ZXJTdGF0ZS5QQVVTRUQpKSB7XG4gICAgICAgICAgdGhpcy5vblBsYXlFcnJvcigpO1xuICAgICAgICAgIHRoaXMub25QbGF5Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25QbGF5RXJyb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gWW91dHViZTtcbn0oKTtcblxudmFyIGFwaSQxID0gJ2h0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS9hcGkvcGxheWVyLmpzJztcbnZhciB0aHVtYm5haWxBcGkgPSAnaHR0cDovL3ZpbWVvLmNvbS9hcGkvdjIvdmlkZW8ve2lkfS5qc29uJztcbnZhciBhcGlMb2FkZWQkMSA9IGZhbHNlO1xuXG52YXIgVmltZW9QbGF5ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWaW1lb1BsYXllcihzZWN0aW9uLCBlbCwgaWQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpbWVvUGxheWVyKTtcblxuICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnN0YXJ0TXV0ZWQgPSBvcHRpb25zLnN0YXJ0TXV0ZWQ7XG4gICAgdGhpcy5sb29wVmlkZW8gPSBvcHRpb25zLmxvb3BWaWRlbztcbiAgICB0aGlzLmNvdmVySW1hZ2UgPSB0aGlzLnNlY3Rpb24ucXVlcnlTZWxlY3RvcignW2RhdGEtdmltZW8taW1hZ2VdJyk7XG4gICAgdGhpcy5vbkFwaUxvYWRlZCA9IHRoaXMuX29uQXBpTG9hZGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5vblJlYWR5ID0gdGhpcy5fb25SZWFkeS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLm9uUGxheUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLnN0YXJ0ZWRQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5vblByb2dyZXNzID0gdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKGFwaUxvYWRlZCQxKSB7XG4gICAgICB0aGlzLl9vbkFwaUxvYWRlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHQoYXBpJDEsIHRoaXMub25BcGlMb2FkZWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvdmVySW1hZ2UpIHtcbiAgICAgIC8vIEFkZCB0aGUgY292ZXIgaW1hZ2UgZm9yIHZpbWVvIHZpZGVvc1xuICAgICAgZmV0Y2godGh1bWJuYWlsQXBpLnJlcGxhY2UoJ3tpZH0nLCB0aGlzLmlkKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgX3RoaXMuY292ZXJJbWFnZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGRhdGFbMF0udGh1bWJuYWlsX2xhcmdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaW1lb1BsYXllciwgW3tcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIF90aGlzMi5vblBsYXlDYWxsYmFjayA9IHJlc29sdmU7XG4gICAgICAgIF90aGlzMi5vblBsYXlFcnJvciA9IHJlamVjdDtcblxuICAgICAgICBpZiAoX3RoaXMyLmlzUmVhZHkpIHtcbiAgICAgICAgICBfdGhpczIucGxheWVyLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3Byb2dyZXNzJywgX3RoaXMyLm9uUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyLm9mZigncHJvZ3Jlc3MnLCBfdGhpczIub25Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIF90aGlzMi5vblBsYXlFcnJvcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMi5vblJlYWR5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLnBsYXllci5vbigncHJvZ3Jlc3MnLCBfdGhpczIub25Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICBfdGhpczIucGxheWVyLm9mZigncHJvZ3Jlc3MnLCBfdGhpczIub25Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgICAgX3RoaXMyLm9uUGxheUVycm9yKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLnBsYXllci5wYXVzZSgpW1wiY2F0Y2hcIl0oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5sb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIHRoaXMucGxheWVyLnVubG9hZCgpW1wiY2F0Y2hcIl0oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uQXBpTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkFwaUxvYWRlZCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB0aGlzLnBsYXllciA9IG5ldyB3aW5kb3cuVmltZW8uUGxheWVyKHRoaXMuZWwsIHtcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIG11dGVkOiB0aGlzLnN0YXJ0TXV0ZWQsXG4gICAgICAgIGxvb3A6IHRoaXMubG9vcFZpZGVvXG4gICAgICB9KTtcbiAgICAgIHRoaXMucGxheWVyLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5fb25SZWFkeSgpO1xuICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5vblBsYXlFcnJvcigpO1xuICAgICAgfSk7XG4gICAgICBhcGlMb2FkZWQkMSA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblJlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblJlYWR5KCkge1xuICAgICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblByb2dyZXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblByb2dyZXNzKCkge1xuICAgICAgdGhpcy5zdGFydGVkUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsYXllci5vZmYoJ3Byb2dyZXNzJywgdGhpcy5vblByb2dyZXNzKTtcblxuICAgICAgaWYgKHRoaXMub25QbGF5Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblBsYXlDYWxsYmFjaygpO1xuICAgICAgICB0aGlzLm9uUGxheUNhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmltZW9QbGF5ZXI7XG59KCk7XG5cbnZhciBsb2FkUGx5clN0eWxlcyA9IG51bGw7XG5cbnZhciBIVE1MNVZpZGVvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSFRNTDVWaWRlbyhzZWN0aW9uLCBlbCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSFRNTDVWaWRlbyk7XG5cbiAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uO1xuICAgIHRoaXMudmlkZW9FbGVtZW50ID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaHRtbDUtdmlkZW9dJyk7XG4gICAgdGhpcy5zdGFydE11dGVkID0gb3B0aW9ucy5zdGFydE11dGVkO1xuICAgIHRoaXMubG9vcFZpZGVvID0gb3B0aW9ucy5sb29wVmlkZW87XG4gICAgdGhpcy5hc3BlY3RSYXRpbyA9IG9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgdGhpcy5zZXR1cFZpZGVvID0gdGhpcy5zZXR1cFZpZGVvLmJpbmQodGhpcyk7XG4gICAgdGhpcy5wbGF5ID0gdGhpcy5wbGF5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wYXVzZSA9IHRoaXMucGF1c2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVubG9hZCA9IHRoaXMudW5sb2FkLmJpbmQodGhpcyk7XG5cbiAgICBpZiAoIShsb2FkUGx5clN0eWxlcyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICBsb2FkUGx5clN0eWxlcyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciBzdHlsZXNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgc3R5bGVzaGVldC5ocmVmID0gJ2h0dHBzOi8vY2RuLnNob3BpZnkuY29tL3Nob3BpZnljbG91ZC9zaG9waWZ5LXBseXIvdjEuMC9zaG9waWZ5LXBseXIuY3NzJztcbiAgICAgICAgc3R5bGVzaGVldC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlc2hlZXQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgd2luZG93LlNob3BpZnkubG9hZEZlYXR1cmVzKFt7XG4gICAgICBuYW1lOiAndmlkZW8tdWknLFxuICAgICAgdmVyc2lvbjogJzEuMCcsXG4gICAgICBvbkxvYWQ6IGZ1bmN0aW9uIG9uTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQbHlyU3R5bGVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zZXR1cFZpZGVvKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1dKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhIVE1MNVZpZGVvLCBbe1xuICAgIGtleTogXCJzZXR1cFZpZGVvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldHVwVmlkZW8oKSB7XG4gICAgICBpZiAoIVNob3BpZnkuUGx5cikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IFNob3BpZnkuUGx5cih0aGlzLnZpZGVvRWxlbWVudCwge1xuICAgICAgICBtdXRlZDogdGhpcy5zdGFydE11dGVkLFxuICAgICAgICBsb29wOiB7XG4gICAgICAgICAgYWN0aXZlOiB0aGlzLmxvb3BWaWRlb1xuICAgICAgICB9LFxuICAgICAgICByYXRpbzogdGhpcy5hc3BlY3RSYXRpb1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAoX3RoaXMyLnBsYXllcikge1xuICAgICAgICAgIF90aGlzMi5wbGF5ZXIucGxheSgpO1xuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgaWYgKHRoaXMucGxheWVyKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSFRNTDVWaWRlbztcbn0oKTtcblxudmFyIFZpZGVvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVmlkZW8oc2VjdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlkZW8pO1xuXG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLnBsYXlCdXR0b24gPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXZpZGVvLXBsYXktYnV0dG9uXScpO1xuICAgIHRoaXMudmlkZW9FbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdmlkZW9dJyk7XG4gICAgdGhpcy52aWRlbyA9IG51bGw7XG4gICAgdGhpcy5wbGF5QnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICAgIHZhciBhdXRvcGxheSA9IHRoaXMuc2V0dGluZ3MuYXV0b3BsYXkgfHwgZmFsc2U7XG4gICAgdmFyIHN0YXJ0TXV0ZWQgPSB0aGlzLnNldHRpbmdzLnN0YXJ0TXV0ZWQgIT0gbnVsbCA/IHRoaXMuc2V0dGluZ3Muc3RhcnRNdXRlZCA6IHRydWU7XG4gICAgdmFyIGxvb3BWaWRlbyA9IHRoaXMuc2V0dGluZ3MubG9vcFZpZGVvIHx8IGZhbHNlO1xuICAgIHZhciBhc3BlY3RSYXRpbyA9IHRoaXMuc2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgdmFyIHR5cGUgPSB0aGlzLnZpZGVvRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvJyk7XG4gICAgdmFyIGlkID0gdGhpcy52aWRlb0VsLmdldEF0dHJpYnV0ZSgnZGF0YS12aWRlby1pZCcpO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgdGhpcy52aWRlbyA9IG5ldyBZb3V0dWJlKHRoaXMudmlkZW9FbCwgaWQsIHtcbiAgICAgICAgICBzdGFydE11dGVkOiBzdGFydE11dGVkLFxuICAgICAgICAgIGxvb3BWaWRlbzogbG9vcFZpZGVvXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndmltZW8nOlxuICAgICAgICB0aGlzLnZpZGVvID0gbmV3IFZpbWVvUGxheWVyKHRoaXMuZWwsIHRoaXMudmlkZW9FbCwgaWQsIHtcbiAgICAgICAgICBzdGFydE11dGVkOiBzdGFydE11dGVkLFxuICAgICAgICAgIGxvb3BWaWRlbzogbG9vcFZpZGVvXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnaHRtbDUnOlxuICAgICAgICB0aGlzLnZpZGVvID0gbmV3IEhUTUw1VmlkZW8odGhpcy5lbCwgdGhpcy52aWRlb0VsLCB7XG4gICAgICAgICAgc3RhcnRNdXRlZDogc3RhcnRNdXRlZCxcbiAgICAgICAgICBsb29wVmlkZW86IGxvb3BWaWRlbyxcbiAgICAgICAgICBhc3BlY3RSYXRpbzogYXNwZWN0UmF0aW9cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnZpZGVvID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fcGxheSA9IHRoaXMuX3BsYXkuYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLnBsYXlCdXR0b24pIHtcbiAgICAgIHRoaXMub25QbGF5QnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnBsYXlCdXR0b25DbGlja2VkID0gdHJ1ZTtcblxuICAgICAgICBfdGhpcy5fcGxheSgpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5wbGF5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vblBsYXlCdXR0b25DbGljayk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZpZXdwb3J0SXNNb2JpbGUoKSAmJiBhdXRvcGxheSkge1xuICAgICAgLy8gU2V0IHVwIGF1dG9wbGF5IGZvciB3aGVuIHRoZSB2aWRlbyBpcyBpbiB0aGUgdmlld3BvcnRcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlzSW50ZXJzZWN0aW5nID0gZW50cmllc1swXS5pc0ludGVyc2VjdGluZztcblxuICAgICAgICBpZiAoaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICBfdGhpcy5fcGxheSgpO1xuXG4gICAgICAgICAgX3RoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKF90aGlzLnZpZGVvRWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZGVvRWwpO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWRlbywgW3tcbiAgICBrZXk6IFwiX3BsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3BsYXkoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5lbC5kYXRhc2V0LnZpZGVvTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnZpZGVvLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9UcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9UcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9QbGF5aW5nID0gdHJ1ZTsgLy8gVGhpcyBpcyBmb3IgYWNjZXNzaWJpbGl0eSwgdGhlIHZpZGVvIHNob3VsZCByZWNlaXZlIGZvY3VzIGFmdGVyIHBsYXlpbmcuXG5cbiAgICAgICAgICBpZiAoX3RoaXMyLnBsYXlCdXR0b25DbGlja2VkKSB7XG4gICAgICAgICAgICBfdGhpczIudmlkZW9FbC5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBXZSBzaG91bGQgcGF1c2UgdGhlIHZpZGVvIGluIGNhc2UgaXQgZG9lcyBzdGFydFxuICAgICAgICAvLyBwbGF5aW5nIHVuZGVybmVhdGggdGhlIG92ZXJsYXlcbiAgICAgICAgX3RoaXMyLnZpZGVvLnBhdXNlKCk7XG5cbiAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIF90aGlzMi5lbC5kYXRhc2V0LnZpZGVvUGxheWluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgdGhlbWUgaWYgdGhlIGJyZWFrcG9pbnQgaXMgZGlmZmVyZW50IHRoYW4gNzIwLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwidmlld3BvcnRJc01vYmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2aWV3cG9ydElzTW9iaWxlKCkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIDwgNzIwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25VbmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uVW5sb2FkKCkge1xuICAgICAgaWYgKHRoaXMucGxheUJ1dHRvbikge1xuICAgICAgICB0aGlzLnBsYXlCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uUGxheUNsaWNrKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgdGhpcy52aWRlby51bmxvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmlkZW87XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-video/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/rimg-shopify/dist/index.es.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/@pixelunion/rimg-shopify/dist/index.es.js ***!
+ \****************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*!\n * @pixelunion/rimg-shopify v2.7.1\n * (c) 2023 Pixel Union\n */\n/*!\n * @pixelunion/rimg v2.2.2\n * (c) 2022 Pixel Union\n */\n\n/**\n * The default template render function. Turns a template string into an image\n * URL.\n *\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\nfunction defaultTemplateRender(template, size) {\n return template.replace('{size}', \"\".concat(size.width, \"x\").concat(size.height));\n}\n/**\n * @type Settings\n */\n\n\nvar defaults = {\n scale: 1,\n template: false,\n templateRender: defaultTemplateRender,\n max: {\n width: Infinity,\n height: Infinity\n },\n round: 32,\n placeholder: false,\n crop: null\n};\n/**\n * Get a data attribute value from an element, with a default fallback and\n * sanitization step.\n *\n * @param {Element} el\n *\n * @param {String} name\n * The data attribute name.\n *\n * @param {Object} options\n * An object holding fallback values if the data attribute does not\n * exist. If this object doesn't have the property, we further fallback\n * to our defaults.\n *\n * @param {Function} [sanitize]\n * A function to sanitize the data attribute value with.\n *\n * @returns {String|*}\n */\n\nfunction getData(el, name, options, sanitize) {\n var attr = \"data-rimg-\".concat(name);\n if (!el.hasAttribute(attr)) return options[name] || defaults[name];\n var value = el.getAttribute(attr);\n return sanitize ? sanitize(value) : value;\n}\n/**\n * Sanitize data attributes that represent a size (in the form of `10x10`).\n *\n * @param {String} value\n * @returns {Object} An object with `width` and `height` properties.\n */\n\n\nfunction parseSize(value) {\n value = value.split('x');\n return {\n width: parseInt(value[0], 10),\n height: parseInt(value[1], 10)\n };\n}\n/**\n * Sanitize crop values to ensure they are valid, or null\n *\n * @param {String} value\n * @returns {Object} Shopify crop parameter ('top', 'center', 'bottom', 'left', 'right') or null, if an unsupported value is found\n */\n\n\nfunction processCropValue(value) {\n switch (value) {\n case 'top':\n case 'center':\n case 'bottom':\n case 'left':\n case 'right':\n return value;\n\n default:\n return null;\n }\n}\n/**\n * Loads information about an element.\n *\n * Options can be set on the element itself using data attributes, or through\n * the `options` parameter. Data attributes take priority.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n * @returns {Item}\n */\n\n\nfunction parseItem(el) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var isImage = el.hasAttribute('data-rimg-template');\n /**\n * @typedef {Settings} Item\n */\n\n return {\n el: el,\n // Type of element\n isImage: isImage,\n isBackgroundImage: isImage && el.tagName !== 'IMG',\n // Image scale\n scale: parseInt(getData(el, 'scale', options)),\n // Device density\n density: window.devicePixelRatio || 1,\n // Image template URL\n template: getData(el, 'template', options),\n templateRender: options.templateRender || defaults.templateRender,\n // Maximum image dimensions\n max: getData(el, 'max', options, parseSize),\n // Round image dimensions to the nearest multiple\n round: getData(el, 'round', options),\n // Placeholder image dimensions\n placeholder: getData(el, 'placeholder', options, parseSize),\n // Crop value; null if image is uncropped, otherwise equal to the Shopify crop parameter ('center', 'top', etc.)\n crop: getData(el, 'crop', options, processCropValue)\n };\n}\n/**\n * Round to the nearest multiple.\n *\n * This is so we don't tax the image server too much.\n *\n * @param {Number} size The size, in pixels.\n * @param {Number} [multiple] The multiple to round to the nearest.\n * @param {Number} [maxLimit] Maximum allowed value - value to return if rounded multiple is above this limit\n * @returns {Number}\n */\n\n\nfunction roundSize(size) {\n var multiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32;\n var maxLimit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;\n return size === 0 ? multiple : Math.min(Math.ceil(size / multiple) * multiple, maxLimit);\n}\n/**\n * Get the size of an element.\n *\n * If it is too small, it's parent element is checked, and so on. This helps\n * avoid the situation where an element doesn't have a size yet or is positioned\n * out of the layout.\n *\n * @param {HTMLElement} el\n * @return {Object} size\n * @return {Number} size.width The width, in pixels.\n * @return {Number} size.height The height, in pixels.\n */\n\n\nfunction getElementSize(el) {\n var size = {\n width: 0,\n height: 0\n };\n\n while (el) {\n size.width = el.offsetWidth;\n size.height = el.offsetHeight;\n if (size.width > 20 && size.height > 20) break;\n el = el.parentNode;\n }\n\n return size;\n}\n/**\n * Return the maximum supported density of the image, given the container.\n *\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction supportedDensity(item, size) {\n return Math.min(Math.min(Math.max(item.max.width / size.width, 1), item.density), Math.min(Math.max(item.max.height / size.height, 1), item.density)).toFixed(2);\n}\n/**\n * Trigger a custom event.\n *\n * Note: this approach is deprecated, but still required to support older\n * browsers such as IE 10.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events\n *\n * @param {HTMLElement} el\n * The element to trigger the event on.\n *\n * @param {String} name\n * The event name.\n *\n * @returns {Boolean}\n * True if the event was canceled.\n */\n\n\nfunction trigger(el, name) {\n var event = document.createEvent('Event');\n event.initEvent(name, true, true);\n return !el.dispatchEvent(event);\n}\n/**\n * Set the image URL on the element. Supports background images and `srcset`.\n *\n * @param {Item} item\n * @param {Size} size\n * @param {Boolean} isPlaceholder\n */\n\n\nfunction setImage(item, size, isPlaceholder, onLoad) {\n var render = item.templateRender;\n var density = isPlaceholder ? 1 : supportedDensity(item, size);\n var round = isPlaceholder ? 1 : item.round; // Calculate the final display size, taking into account the image's\n // maximum dimensions.\n\n var targetWidth = size.width * density;\n var targetHeight = size.height * density;\n var displaySize;\n\n if (item.crop) {\n displaySize = {\n width: roundSize(targetWidth, round, item.max.width),\n height: roundSize(targetHeight, round, item.max.height)\n };\n } else {\n // Shopify serves images clamped by the requested dimensions (fitted to the smallest dimension).\n // To get the desired and expected pixel density we need to request cover dimensions (fitted to largest dimension).\n // This isn't a problem with cropped images which are served at the exact dimension requested.\n var containerAspectRatio = size.width / size.height;\n var imageAspectRatio = item.max.width / item.max.height;\n\n if (containerAspectRatio > imageAspectRatio) {\n // fit width\n displaySize = {\n width: roundSize(targetWidth, round, item.max.width),\n height: roundSize(targetWidth / imageAspectRatio, round, item.max.height)\n };\n } else {\n // fit height\n displaySize = {\n width: roundSize(targetHeight * imageAspectRatio, round, item.max.width),\n height: roundSize(targetHeight, round, item.max.height)\n };\n }\n }\n\n var url = render(item.template, displaySize); // On load callback\n\n var image = new Image();\n image.onload = onLoad;\n image.src = url; // Set image\n\n if (item.isBackgroundImage) {\n item.el.style.backgroundImage = \"url('\".concat(url, \"')\");\n } else {\n item.el.setAttribute('srcset', \"\".concat(url, \" \").concat(density, \"x\"));\n }\n}\n/**\n * Load the image, set loaded status, and trigger the load event.\n *\n * @fires rimg:load\n * @fires rimg:error\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction loadFullImage(item, size) {\n var el = item.el;\n setImage(item, size, false, function (event) {\n if (event.type === 'load') {\n el.setAttribute('data-rimg', 'loaded');\n } else {\n el.setAttribute('data-rimg', 'error');\n trigger(el, 'rimg:error');\n }\n\n trigger(el, 'rimg:load');\n });\n}\n/**\n * Load in a responsive image.\n *\n * Sets the image's `srcset` attribute to the final image URLs, calculated based\n * on the actual size the image is being shown at.\n *\n * @fires rimg:loading\n * The image URLs have been set and we are waiting for them to load.\n *\n * @fires rimg:loaded\n * The final image has loaded.\n *\n * @fires rimg:error\n * The final image failed loading.\n *\n * @param {Item} item\n */\n\n\nfunction loadImage(item) {\n var el = item.el; // Already loaded?\n\n var status = el.getAttribute('data-rimg');\n if (status === 'loading' || status === 'loaded') return; // Is the SVG loaded?\n // In Firefox, el.complete always returns true [citation needed, may not be the case anymore, Jan/2022]\n // so we also check el.naturalWidth, which equals 0 until the image loads\n\n if (!item.isBackgroundImage) {\n if (el.naturalWidth === 0 || !el.complete) {\n // Wait for the load event, then call load image\n el.addEventListener('load', function cb() {\n el.removeEventListener('load', cb);\n loadImage(item);\n });\n return;\n }\n } // Trigger loading event, and stop if cancelled\n\n\n if (trigger(el, 'rimg:loading')) return; // Mark as loading\n\n el.setAttribute('data-rimg', 'loading'); // Get element size. This is used as the ideal display size.\n\n var size = getElementSize(item.el);\n size.width *= item.scale;\n size.height *= item.scale;\n\n if (item.placeholder) {\n // Load a placeholder image first, followed by the full image. Force the\n // element to keep its dimensions while it loads. If the image is smaller\n // than the element size, use the image's size. Density is taken into account\n // for HiDPI devices to avoid blurry images.\n if (!item.isBackgroundImage) {\n el.setAttribute('width', Math.min(Math.floor(item.max.width / item.density), size.width));\n el.setAttribute('height', Math.min(Math.floor(item.max.height / item.density), size.height));\n }\n\n setImage(item, item.placeholder, true, function () {\n return loadFullImage(item, size);\n });\n } else {\n loadFullImage(item, size);\n }\n}\n/**\n * Prepare an element to be displayed on the screen.\n *\n * Images have special logic applied to them to swap out the different sources.\n *\n * @fires rimg:enter\n * The element is entering the viewport.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction load(el, options) {\n if (!el) return;\n trigger(el, 'rimg:enter');\n var item = parseItem(el, options);\n\n if (item.isImage) {\n if (!item.isBackgroundImage) {\n el.setAttribute('data-rimg-template-svg', el.getAttribute('srcset'));\n }\n\n loadImage(item);\n }\n}\n/**\n * Reset an element's state so that its image can be recalculated.\n *\n * @fires rimg:update\n * The element is being updated.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction update(el, options) {\n if (!el) return;\n trigger(el, 'rimg:update');\n var item = parseItem(el, options);\n\n if (item.isImage) {\n if (!item.isBackgroundImage) {\n el.setAttribute('data-rimg', 'lazy');\n el.setAttribute('srcset', el.getAttribute('data-rimg-template-svg'));\n }\n\n loadImage(item);\n }\n}\n/**\n * Returns true if the element is within the viewport.\n * @param {HTMLElement} el\n * @returns {Boolean}\n */\n\n\nfunction inViewport(el) {\n if (!el.offsetWidth || !el.offsetHeight || !el.getClientRects().length) {\n return false;\n }\n\n var root = document.documentElement;\n var width = Math.min(root.clientWidth, window.innerWidth);\n var height = Math.min(root.clientHeight, window.innerHeight);\n var rect = el.getBoundingClientRect();\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= height && rect.left <= width;\n}\n/**\n * @typedef {Object} Size\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * A function to turn a template string into a URL.\n *\n * @callback TemplateRenderer\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\n\n/**\n * @typedef {Object} Settings\n *\n * @property {String} [template]\n * A template string used to generate URLs for an image. This allows us to\n * dynamically load images with sizes to match the container's size.\n *\n * @property {TemplateRenderer} [templateRender]\n * A function to turn a template string into a URL.\n *\n * @property {Size} [max]\n * The maximum available size for the image. This ensures we don't\n * try to load an image larger than is possible.\n * \n * @property {Number} [scale]\n * A number to scale the final image dimensions by. \n * Only applies to lazy-loaded images. Defaults to 1.\n *\n * @property {Number} [round]\n * Round image dimensions to the nearest multiple. This is intended to\n * tax the image server less by lowering the number of possible image\n * sizes requested.\n *\n * @property {Size} [placeholder]\n * The size of the lo-fi image to load before the full image.\n * \n * @property {String} [crop]\n * Crop value; null if image is uncropped, otherwise equal \n * to the Shopify crop parameter ('center', 'top', etc.).\n */\n\n/**\n * Initialize the responsive image handler.\n *\n * @param {String|HTMLElement|NodeList} selector\n * The CSS selector, element, or elements to track for lazy-loading.\n *\n * @param {Settings} options\n *\n * @returns {PublicApi}\n */\n\n\nfunction rimg() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Intersections\n\n var io = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(entry.target);\n load(entry.target, options);\n }\n });\n }, {\n // Watch the viewport, with 20% vertical margins\n rootMargin: '20% 0px'\n });\n /**\n * @typedef {Object} PublicApi\n */\n\n var api = {\n /**\n * Track a new selector, element, or nodelist for lazy-loading.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n track: function track() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n // If an element is already in the viewport, load it right away. This\n // fixes a race-condition with dynamically added elements.\n if (inViewport(els[i])) {\n load(els[i], options);\n } else {\n io.observe(els[i]);\n }\n }\n },\n\n /**\n * Update element(s) that have already been loaded to force their images\n * to be recalculated.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n update: function update$1() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"loaded\"]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n update(els[i], options);\n }\n },\n\n /**\n * Stop tracking element(s) for lazy-loading.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n untrack: function untrack() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n io.unobserve(els[i]);\n }\n },\n\n /**\n * Manually load images.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n load: function load$1() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n load(els[i], options);\n }\n },\n\n /**\n * Unload all event handlers and observers.\n * @type Function\n */\n unload: function unload() {\n io.disconnect();\n }\n }; // Add initial elements\n\n api.track(selector);\n return api;\n}\n/**\n * Finds a group of elements on the page.\n *\n * @param {String|HTMLElement|NodeList} selector\n * @returns {Object} An array-like object.\n */\n\n\nfunction querySelector(selector) {\n if (typeof selector === 'string') {\n return document.querySelectorAll(selector);\n }\n\n if (selector instanceof HTMLElement) {\n return [selector];\n }\n\n if (selector instanceof NodeList) {\n return selector;\n }\n\n return [];\n}\n\n/**\n * Polyfill for Element.matches().\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\n */\nif (!Element.prototype.matches) {\n Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n i = matches.length;\n\n while (--i >= 0 && matches.item(i) !== this) {}\n\n return i > -1;\n };\n}\n\nvar state = {\n init: init,\n watch: watch,\n unwatch: unwatch,\n load: load$1\n};\n\nfunction init() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n state.selector = selector;\n state.instance = rimg(selector, options);\n state.loadedWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Listen for Shopify theme editor events\n\n document.addEventListener('shopify:section:load', function (event) {\n return watch(event.target);\n });\n window.addEventListener('resize', function () {\n return _update();\n });\n document.addEventListener('shopify:section:unload', function (event) {\n return unwatch(event.target);\n }); // Listen for custom events to allow themes to hook into rimg\n\n document.addEventListener('theme:rimg:watch', function (event) {\n return watch(event.target);\n });\n document.addEventListener('theme:rimg:unwatch', function (event) {\n return unwatch(event.target);\n }); // Support custom events triggered through jQuery\n // See: https://github.com/jquery/jquery/issues/3347\n\n if (window.jQuery) {\n jQuery(document).on({\n 'theme:rimg:watch': function themeRimgWatch(event) {\n return watch(event.target);\n },\n 'theme:rimg:unwatch': function themeRimgUnwatch(event) {\n return unwatch(event.target);\n }\n });\n }\n}\n/**\n * Track an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction watch(el) {\n // Track element\n if (typeof el.matches === 'function' && el.matches(state.selector)) {\n state.instance.track(el);\n } // Track element's children\n\n\n state.instance.track(el.querySelectorAll(state.selector));\n}\n/**\n * Untrack an element, and its children\n *\n * @param {HTMLElement} el\n * @private\n */\n\n\nfunction unwatch(el) {\n // Untrack element's children\n state.instance.untrack(el.querySelectorAll(state.selector)); // Untrack element\n\n if (typeof el.matches === 'function' && el.matches(state.selector)) {\n state.instance.untrack(el);\n }\n}\n/**\n * Manually load an image\n *\n * @param {HTMLElement} el\n */\n\n\nfunction load$1(el) {\n // Load element\n if (typeof el.matches === 'function' && el.matches(state.selector)) {\n state.instance.load(el);\n } // Load element's children\n\n\n state.instance.load(el.querySelectorAll(state.selector));\n}\n/**\n * Update an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction _update() {\n var currentWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Return if we're not 2x smaller, or larger than the existing loading size\n\n if (currentWidth / state.loadedWidth > 0.5 && currentWidth / state.loadedWidth < 2) {\n return;\n }\n\n state.loadedWidth = currentWidth;\n state.instance.update();\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (state);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5L2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeS9kaXN0L2luZGV4LmVzLmpzP2Q5MmEiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnkgdjIuNy4xXG4gKiAoYykgMjAyMyBQaXhlbCBVbmlvblxuICovXG4vKiFcbiAqIEBwaXhlbHVuaW9uL3JpbWcgdjIuMi4yXG4gKiAoYykgMjAyMiBQaXhlbCBVbmlvblxuICovXG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9uLiBUdXJucyBhIHRlbXBsYXRlIHN0cmluZyBpbnRvIGFuIGltYWdlXG4gKiBVUkwuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRUZW1wbGF0ZVJlbmRlcih0ZW1wbGF0ZSwgc2l6ZSkge1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgne3NpemV9JywgXCJcIi5jb25jYXQoc2l6ZS53aWR0aCwgXCJ4XCIpLmNvbmNhdChzaXplLmhlaWdodCkpO1xufVxuLyoqXG4gKiBAdHlwZSBTZXR0aW5nc1xuICovXG5cblxudmFyIGRlZmF1bHRzID0ge1xuICBzY2FsZTogMSxcbiAgdGVtcGxhdGU6IGZhbHNlLFxuICB0ZW1wbGF0ZVJlbmRlcjogZGVmYXVsdFRlbXBsYXRlUmVuZGVyLFxuICBtYXg6IHtcbiAgICB3aWR0aDogSW5maW5pdHksXG4gICAgaGVpZ2h0OiBJbmZpbml0eVxuICB9LFxuICByb3VuZDogMzIsXG4gIHBsYWNlaG9sZGVyOiBmYWxzZSxcbiAgY3JvcDogbnVsbFxufTtcbi8qKlxuICogR2V0IGEgZGF0YSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50LCB3aXRoIGEgZGVmYXVsdCBmYWxsYmFjayBhbmRcbiAqIHNhbml0aXphdGlvbiBzdGVwLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogICAgICAgIFRoZSBkYXRhIGF0dHJpYnV0ZSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgICAgICAgQW4gb2JqZWN0IGhvbGRpbmcgZmFsbGJhY2sgdmFsdWVzIGlmIHRoZSBkYXRhIGF0dHJpYnV0ZSBkb2VzIG5vdFxuICogICAgICAgIGV4aXN0LiBJZiB0aGlzIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIHByb3BlcnR5LCB3ZSBmdXJ0aGVyIGZhbGxiYWNrXG4gKiAgICAgICAgdG8gb3VyIGRlZmF1bHRzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtzYW5pdGl6ZV1cbiAqICAgICAgICBBIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSBkYXRhIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoLlxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd8Kn1cbiAqL1xuXG5mdW5jdGlvbiBnZXREYXRhKGVsLCBuYW1lLCBvcHRpb25zLCBzYW5pdGl6ZSkge1xuICB2YXIgYXR0ciA9IFwiZGF0YS1yaW1nLVwiLmNvbmNhdChuYW1lKTtcbiAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHJldHVybiBvcHRpb25zW25hbWVdIHx8IGRlZmF1bHRzW25hbWVdO1xuICB2YXIgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gIHJldHVybiBzYW5pdGl6ZSA/IHNhbml0aXplKHZhbHVlKSA6IHZhbHVlO1xufVxuLyoqXG4gKiBTYW5pdGl6ZSBkYXRhIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgYSBzaXplIChpbiB0aGUgZm9ybSBvZiBgMTB4MTBgKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBwYXJzZVNpemUodmFsdWUpIHtcbiAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgneCcpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBwYXJzZUludCh2YWx1ZVswXSwgMTApLFxuICAgIGhlaWdodDogcGFyc2VJbnQodmFsdWVbMV0sIDEwKVxuICB9O1xufVxuLyoqXG4gKiBTYW5pdGl6ZSBjcm9wIHZhbHVlcyB0byBlbnN1cmUgdGhleSBhcmUgdmFsaWQsIG9yIG51bGxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFNob3BpZnkgY3JvcCBwYXJhbWV0ZXIgKCd0b3AnLCAnY2VudGVyJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0Jykgb3IgbnVsbCwgaWYgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgaXMgZm91bmRcbiAqL1xuXG5cbmZ1bmN0aW9uIHByb2Nlc3NDcm9wVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh2YWx1ZSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICBjYXNlICdib3R0b20nOlxuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBMb2FkcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbGVtZW50LlxuICpcbiAqIE9wdGlvbnMgY2FuIGJlIHNldCBvbiB0aGUgZWxlbWVudCBpdHNlbGYgdXNpbmcgZGF0YSBhdHRyaWJ1dGVzLCBvciB0aHJvdWdoXG4gKiB0aGUgYG9wdGlvbnNgIHBhcmFtZXRlci4gRGF0YSBhdHRyaWJ1dGVzIHRha2UgcHJpb3JpdHkuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtJdGVtfVxuICovXG5cblxuZnVuY3Rpb24gcGFyc2VJdGVtKGVsKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGlzSW1hZ2UgPSBlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmltZy10ZW1wbGF0ZScpO1xuICAvKipcbiAgICogQHR5cGVkZWYge1NldHRpbmdzfSBJdGVtXG4gICAqL1xuXG4gIHJldHVybiB7XG4gICAgZWw6IGVsLFxuICAgIC8vIFR5cGUgb2YgZWxlbWVudFxuICAgIGlzSW1hZ2U6IGlzSW1hZ2UsXG4gICAgaXNCYWNrZ3JvdW5kSW1hZ2U6IGlzSW1hZ2UgJiYgZWwudGFnTmFtZSAhPT0gJ0lNRycsXG4gICAgLy8gSW1hZ2Ugc2NhbGVcbiAgICBzY2FsZTogcGFyc2VJbnQoZ2V0RGF0YShlbCwgJ3NjYWxlJywgb3B0aW9ucykpLFxuICAgIC8vIERldmljZSBkZW5zaXR5XG4gICAgZGVuc2l0eTogd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSxcbiAgICAvLyBJbWFnZSB0ZW1wbGF0ZSBVUkxcbiAgICB0ZW1wbGF0ZTogZ2V0RGF0YShlbCwgJ3RlbXBsYXRlJywgb3B0aW9ucyksXG4gICAgdGVtcGxhdGVSZW5kZXI6IG9wdGlvbnMudGVtcGxhdGVSZW5kZXIgfHwgZGVmYXVsdHMudGVtcGxhdGVSZW5kZXIsXG4gICAgLy8gTWF4aW11bSBpbWFnZSBkaW1lbnNpb25zXG4gICAgbWF4OiBnZXREYXRhKGVsLCAnbWF4Jywgb3B0aW9ucywgcGFyc2VTaXplKSxcbiAgICAvLyBSb3VuZCBpbWFnZSBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlXG4gICAgcm91bmQ6IGdldERhdGEoZWwsICdyb3VuZCcsIG9wdGlvbnMpLFxuICAgIC8vIFBsYWNlaG9sZGVyIGltYWdlIGRpbWVuc2lvbnNcbiAgICBwbGFjZWhvbGRlcjogZ2V0RGF0YShlbCwgJ3BsYWNlaG9sZGVyJywgb3B0aW9ucywgcGFyc2VTaXplKSxcbiAgICAvLyBDcm9wIHZhbHVlOyBudWxsIGlmIGltYWdlIGlzIHVuY3JvcHBlZCwgb3RoZXJ3aXNlIGVxdWFsIHRvIHRoZSBTaG9waWZ5IGNyb3AgcGFyYW1ldGVyICgnY2VudGVyJywgJ3RvcCcsIGV0Yy4pXG4gICAgY3JvcDogZ2V0RGF0YShlbCwgJ2Nyb3AnLCBvcHRpb25zLCBwcm9jZXNzQ3JvcFZhbHVlKVxuICB9O1xufVxuLyoqXG4gKiBSb3VuZCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZS5cbiAqXG4gKiBUaGlzIGlzIHNvIHdlIGRvbid0IHRheCB0aGUgaW1hZ2Ugc2VydmVyIHRvbyBtdWNoLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIFRoZSBzaXplLCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge051bWJlcn0gW211bHRpcGxlXSBUaGUgbXVsdGlwbGUgdG8gcm91bmQgdG8gdGhlIG5lYXJlc3QuXG4gKiBAcGFyYW0ge051bWJlcn0gW21heExpbWl0XSBNYXhpbXVtIGFsbG93ZWQgdmFsdWUgLSB2YWx1ZSB0byByZXR1cm4gaWYgcm91bmRlZCBtdWx0aXBsZSBpcyBhYm92ZSB0aGlzIGxpbWl0XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5cblxuZnVuY3Rpb24gcm91bmRTaXplKHNpemUpIHtcbiAgdmFyIG11bHRpcGxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAzMjtcbiAgdmFyIG1heExpbWl0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBJbmZpbml0eTtcbiAgcmV0dXJuIHNpemUgPT09IDAgPyBtdWx0aXBsZSA6IE1hdGgubWluKE1hdGguY2VpbChzaXplIC8gbXVsdGlwbGUpICogbXVsdGlwbGUsIG1heExpbWl0KTtcbn1cbi8qKlxuICogR2V0IHRoZSBzaXplIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogSWYgaXQgaXMgdG9vIHNtYWxsLCBpdCdzIHBhcmVudCBlbGVtZW50IGlzIGNoZWNrZWQsIGFuZCBzbyBvbi4gVGhpcyBoZWxwc1xuICogYXZvaWQgdGhlIHNpdHVhdGlvbiB3aGVyZSBhbiBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhIHNpemUgeWV0IG9yIGlzIHBvc2l0aW9uZWRcbiAqIG91dCBvZiB0aGUgbGF5b3V0LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtPYmplY3R9IHNpemVcbiAqIEByZXR1cm4ge051bWJlcn0gc2l6ZS53aWR0aCBUaGUgd2lkdGgsIGluIHBpeGVscy5cbiAqIEByZXR1cm4ge051bWJlcn0gc2l6ZS5oZWlnaHQgVGhlIGhlaWdodCwgaW4gcGl4ZWxzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFNpemUoZWwpIHtcbiAgdmFyIHNpemUgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG5cbiAgd2hpbGUgKGVsKSB7XG4gICAgc2l6ZS53aWR0aCA9IGVsLm9mZnNldFdpZHRoO1xuICAgIHNpemUuaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChzaXplLndpZHRoID4gMjAgJiYgc2l6ZS5oZWlnaHQgPiAyMCkgYnJlYWs7XG4gICAgZWwgPSBlbC5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIHNpemU7XG59XG4vKipcbiAqIFJldHVybiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgZGVuc2l0eSBvZiB0aGUgaW1hZ2UsIGdpdmVuIHRoZSBjb250YWluZXIuXG4gKlxuICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqL1xuXG5cbmZ1bmN0aW9uIHN1cHBvcnRlZERlbnNpdHkoaXRlbSwgc2l6ZSkge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5taW4oTWF0aC5tYXgoaXRlbS5tYXgud2lkdGggLyBzaXplLndpZHRoLCAxKSwgaXRlbS5kZW5zaXR5KSwgTWF0aC5taW4oTWF0aC5tYXgoaXRlbS5tYXguaGVpZ2h0IC8gc2l6ZS5oZWlnaHQsIDEpLCBpdGVtLmRlbnNpdHkpKS50b0ZpeGVkKDIpO1xufVxuLyoqXG4gKiBUcmlnZ2VyIGEgY3VzdG9tIGV2ZW50LlxuICpcbiAqIE5vdGU6IHRoaXMgYXBwcm9hY2ggaXMgZGVwcmVjYXRlZCwgYnV0IHN0aWxsIHJlcXVpcmVkIHRvIHN1cHBvcnQgb2xkZXJcbiAqIGJyb3dzZXJzIHN1Y2ggYXMgSUUgMTAuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9HdWlkZS9FdmVudHMvQ3JlYXRpbmdfYW5kX3RyaWdnZXJpbmdfZXZlbnRzXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogICAgICAgIFRoZSBldmVudCBuYW1lLlxuICpcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogICAgICAgICAgVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGNhbmNlbGVkLlxuICovXG5cblxuZnVuY3Rpb24gdHJpZ2dlcihlbCwgbmFtZSkge1xuICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIHRydWUsIHRydWUpO1xuICByZXR1cm4gIWVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGltYWdlIFVSTCBvbiB0aGUgZWxlbWVudC4gU3VwcG9ydHMgYmFja2dyb3VuZCBpbWFnZXMgYW5kIGBzcmNzZXRgLlxuICpcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzUGxhY2Vob2xkZXJcbiAqL1xuXG5cbmZ1bmN0aW9uIHNldEltYWdlKGl0ZW0sIHNpemUsIGlzUGxhY2Vob2xkZXIsIG9uTG9hZCkge1xuICB2YXIgcmVuZGVyID0gaXRlbS50ZW1wbGF0ZVJlbmRlcjtcbiAgdmFyIGRlbnNpdHkgPSBpc1BsYWNlaG9sZGVyID8gMSA6IHN1cHBvcnRlZERlbnNpdHkoaXRlbSwgc2l6ZSk7XG4gIHZhciByb3VuZCA9IGlzUGxhY2Vob2xkZXIgPyAxIDogaXRlbS5yb3VuZDsgLy8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBkaXNwbGF5IHNpemUsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGltYWdlJ3NcbiAgLy8gbWF4aW11bSBkaW1lbnNpb25zLlxuXG4gIHZhciB0YXJnZXRXaWR0aCA9IHNpemUud2lkdGggKiBkZW5zaXR5O1xuICB2YXIgdGFyZ2V0SGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKiBkZW5zaXR5O1xuICB2YXIgZGlzcGxheVNpemU7XG5cbiAgaWYgKGl0ZW0uY3JvcCkge1xuICAgIGRpc3BsYXlTaXplID0ge1xuICAgICAgd2lkdGg6IHJvdW5kU2l6ZSh0YXJnZXRXaWR0aCwgcm91bmQsIGl0ZW0ubWF4LndpZHRoKSxcbiAgICAgIGhlaWdodDogcm91bmRTaXplKHRhcmdldEhlaWdodCwgcm91bmQsIGl0ZW0ubWF4LmhlaWdodClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFNob3BpZnkgc2VydmVzIGltYWdlcyBjbGFtcGVkIGJ5IHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucyAoZml0dGVkIHRvIHRoZSBzbWFsbGVzdCBkaW1lbnNpb24pLlxuICAgIC8vIFRvIGdldCB0aGUgZGVzaXJlZCBhbmQgZXhwZWN0ZWQgcGl4ZWwgZGVuc2l0eSB3ZSBuZWVkIHRvIHJlcXVlc3QgY292ZXIgZGltZW5zaW9ucyAoZml0dGVkIHRvIGxhcmdlc3QgZGltZW5zaW9uKS5cbiAgICAvLyBUaGlzIGlzbid0IGEgcHJvYmxlbSB3aXRoIGNyb3BwZWQgaW1hZ2VzIHdoaWNoIGFyZSBzZXJ2ZWQgYXQgdGhlIGV4YWN0IGRpbWVuc2lvbiByZXF1ZXN0ZWQuXG4gICAgdmFyIGNvbnRhaW5lckFzcGVjdFJhdGlvID0gc2l6ZS53aWR0aCAvIHNpemUuaGVpZ2h0O1xuICAgIHZhciBpbWFnZUFzcGVjdFJhdGlvID0gaXRlbS5tYXgud2lkdGggLyBpdGVtLm1heC5oZWlnaHQ7XG5cbiAgICBpZiAoY29udGFpbmVyQXNwZWN0UmF0aW8gPiBpbWFnZUFzcGVjdFJhdGlvKSB7XG4gICAgICAvLyBmaXQgd2lkdGhcbiAgICAgIGRpc3BsYXlTaXplID0ge1xuICAgICAgICB3aWR0aDogcm91bmRTaXplKHRhcmdldFdpZHRoLCByb3VuZCwgaXRlbS5tYXgud2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IHJvdW5kU2l6ZSh0YXJnZXRXaWR0aCAvIGltYWdlQXNwZWN0UmF0aW8sIHJvdW5kLCBpdGVtLm1heC5oZWlnaHQpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaXQgaGVpZ2h0XG4gICAgICBkaXNwbGF5U2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IHJvdW5kU2l6ZSh0YXJnZXRIZWlnaHQgKiBpbWFnZUFzcGVjdFJhdGlvLCByb3VuZCwgaXRlbS5tYXgud2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IHJvdW5kU2l6ZSh0YXJnZXRIZWlnaHQsIHJvdW5kLCBpdGVtLm1heC5oZWlnaHQpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cmwgPSByZW5kZXIoaXRlbS50ZW1wbGF0ZSwgZGlzcGxheVNpemUpOyAvLyBPbiBsb2FkIGNhbGxiYWNrXG5cbiAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gIGltYWdlLm9ubG9hZCA9IG9uTG9hZDtcbiAgaW1hZ2Uuc3JjID0gdXJsOyAvLyBTZXQgaW1hZ2VcblxuICBpZiAoaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgIGl0ZW0uZWwuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gXCJ1cmwoJ1wiLmNvbmNhdCh1cmwsIFwiJylcIik7XG4gIH0gZWxzZSB7XG4gICAgaXRlbS5lbC5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsIFwiXCIuY29uY2F0KHVybCwgXCIgXCIpLmNvbmNhdChkZW5zaXR5LCBcInhcIikpO1xuICB9XG59XG4vKipcbiAqIExvYWQgdGhlIGltYWdlLCBzZXQgbG9hZGVkIHN0YXR1cywgYW5kIHRyaWdnZXIgdGhlIGxvYWQgZXZlbnQuXG4gKlxuICogQGZpcmVzIHJpbWc6bG9hZFxuICogQGZpcmVzIHJpbWc6ZXJyb3JcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKi9cblxuXG5mdW5jdGlvbiBsb2FkRnVsbEltYWdlKGl0ZW0sIHNpemUpIHtcbiAgdmFyIGVsID0gaXRlbS5lbDtcbiAgc2V0SW1hZ2UoaXRlbSwgc2l6ZSwgZmFsc2UsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09PSAnbG9hZCcpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xvYWRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycsICdlcnJvcicpO1xuICAgICAgdHJpZ2dlcihlbCwgJ3JpbWc6ZXJyb3InKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGVsLCAncmltZzpsb2FkJyk7XG4gIH0pO1xufVxuLyoqXG4gKiBMb2FkIGluIGEgcmVzcG9uc2l2ZSBpbWFnZS5cbiAqXG4gKiBTZXRzIHRoZSBpbWFnZSdzIGBzcmNzZXRgIGF0dHJpYnV0ZSB0byB0aGUgZmluYWwgaW1hZ2UgVVJMcywgY2FsY3VsYXRlZCBiYXNlZFxuICogb24gdGhlIGFjdHVhbCBzaXplIHRoZSBpbWFnZSBpcyBiZWluZyBzaG93biBhdC5cbiAqXG4gKiBAZmlyZXMgcmltZzpsb2FkaW5nXG4gKiAgICAgICAgVGhlIGltYWdlIFVSTHMgaGF2ZSBiZWVuIHNldCBhbmQgd2UgYXJlIHdhaXRpbmcgZm9yIHRoZW0gdG8gbG9hZC5cbiAqXG4gKiBAZmlyZXMgcmltZzpsb2FkZWRcbiAqICAgICAgICBUaGUgZmluYWwgaW1hZ2UgaGFzIGxvYWRlZC5cbiAqXG4gKiBAZmlyZXMgcmltZzplcnJvclxuICogICAgICAgIFRoZSBmaW5hbCBpbWFnZSBmYWlsZWQgbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqL1xuXG5cbmZ1bmN0aW9uIGxvYWRJbWFnZShpdGVtKSB7XG4gIHZhciBlbCA9IGl0ZW0uZWw7IC8vIEFscmVhZHkgbG9hZGVkP1xuXG4gIHZhciBzdGF0dXMgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycpO1xuICBpZiAoc3RhdHVzID09PSAnbG9hZGluZycgfHwgc3RhdHVzID09PSAnbG9hZGVkJykgcmV0dXJuOyAvLyBJcyB0aGUgU1ZHIGxvYWRlZD9cbiAgLy8gSW4gRmlyZWZveCwgZWwuY29tcGxldGUgYWx3YXlzIHJldHVybnMgdHJ1ZSBbY2l0YXRpb24gbmVlZGVkLCBtYXkgbm90IGJlIHRoZSBjYXNlIGFueW1vcmUsIEphbi8yMDIyXVxuICAvLyBzbyB3ZSBhbHNvIGNoZWNrIGVsLm5hdHVyYWxXaWR0aCwgd2hpY2ggZXF1YWxzIDAgdW50aWwgdGhlIGltYWdlIGxvYWRzXG5cbiAgaWYgKCFpdGVtLmlzQmFja2dyb3VuZEltYWdlKSB7XG4gICAgaWYgKGVsLm5hdHVyYWxXaWR0aCA9PT0gMCB8fCAhZWwuY29tcGxldGUpIHtcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBsb2FkIGV2ZW50LCB0aGVuIGNhbGwgbG9hZCBpbWFnZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uIGNiKCkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgY2IpO1xuICAgICAgICBsb2FkSW1hZ2UoaXRlbSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gLy8gVHJpZ2dlciBsb2FkaW5nIGV2ZW50LCBhbmQgc3RvcCBpZiBjYW5jZWxsZWRcblxuXG4gIGlmICh0cmlnZ2VyKGVsLCAncmltZzpsb2FkaW5nJykpIHJldHVybjsgLy8gTWFyayBhcyBsb2FkaW5nXG5cbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnLCAnbG9hZGluZycpOyAvLyBHZXQgZWxlbWVudCBzaXplLiBUaGlzIGlzIHVzZWQgYXMgdGhlIGlkZWFsIGRpc3BsYXkgc2l6ZS5cblxuICB2YXIgc2l6ZSA9IGdldEVsZW1lbnRTaXplKGl0ZW0uZWwpO1xuICBzaXplLndpZHRoICo9IGl0ZW0uc2NhbGU7XG4gIHNpemUuaGVpZ2h0ICo9IGl0ZW0uc2NhbGU7XG5cbiAgaWYgKGl0ZW0ucGxhY2Vob2xkZXIpIHtcbiAgICAvLyBMb2FkIGEgcGxhY2Vob2xkZXIgaW1hZ2UgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBmdWxsIGltYWdlLiBGb3JjZSB0aGVcbiAgICAvLyBlbGVtZW50IHRvIGtlZXAgaXRzIGRpbWVuc2lvbnMgd2hpbGUgaXQgbG9hZHMuIElmIHRoZSBpbWFnZSBpcyBzbWFsbGVyXG4gICAgLy8gdGhhbiB0aGUgZWxlbWVudCBzaXplLCB1c2UgdGhlIGltYWdlJ3Mgc2l6ZS4gRGVuc2l0eSBpcyB0YWtlbiBpbnRvIGFjY291bnRcbiAgICAvLyBmb3IgSGlEUEkgZGV2aWNlcyB0byBhdm9pZCBibHVycnkgaW1hZ2VzLlxuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIE1hdGgubWluKE1hdGguZmxvb3IoaXRlbS5tYXgud2lkdGggLyBpdGVtLmRlbnNpdHkpLCBzaXplLndpZHRoKSk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIE1hdGgubWluKE1hdGguZmxvb3IoaXRlbS5tYXguaGVpZ2h0IC8gaXRlbS5kZW5zaXR5KSwgc2l6ZS5oZWlnaHQpKTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZShpdGVtLCBpdGVtLnBsYWNlaG9sZGVyLCB0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsb2FkRnVsbEltYWdlKGl0ZW0sIHNpemUpO1xuICB9XG59XG4vKipcbiAqIFByZXBhcmUgYW4gZWxlbWVudCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi5cbiAqXG4gKiBJbWFnZXMgaGF2ZSBzcGVjaWFsIGxvZ2ljIGFwcGxpZWQgdG8gdGhlbSB0byBzd2FwIG91dCB0aGUgZGlmZmVyZW50IHNvdXJjZXMuXG4gKlxuICogQGZpcmVzIHJpbWc6ZW50ZXJcbiAqICAgICAgICBUaGUgZWxlbWVudCBpcyBlbnRlcmluZyB0aGUgdmlld3BvcnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqL1xuXG5cbmZ1bmN0aW9uIGxvYWQoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB0cmlnZ2VyKGVsLCAncmltZzplbnRlcicpO1xuICB2YXIgaXRlbSA9IHBhcnNlSXRlbShlbCwgb3B0aW9ucyk7XG5cbiAgaWYgKGl0ZW0uaXNJbWFnZSkge1xuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUtc3ZnJywgZWwuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKSk7XG4gICAgfVxuXG4gICAgbG9hZEltYWdlKGl0ZW0pO1xuICB9XG59XG4vKipcbiAqIFJlc2V0IGFuIGVsZW1lbnQncyBzdGF0ZSBzbyB0aGF0IGl0cyBpbWFnZSBjYW4gYmUgcmVjYWxjdWxhdGVkLlxuICpcbiAqIEBmaXJlcyByaW1nOnVwZGF0ZVxuICogICAgICAgIFRoZSBlbGVtZW50IGlzIGJlaW5nIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqL1xuXG5cbmZ1bmN0aW9uIHVwZGF0ZShlbCwgb3B0aW9ucykge1xuICBpZiAoIWVsKSByZXR1cm47XG4gIHRyaWdnZXIoZWwsICdyaW1nOnVwZGF0ZScpO1xuICB2YXIgaXRlbSA9IHBhcnNlSXRlbShlbCwgb3B0aW9ucyk7XG5cbiAgaWYgKGl0ZW0uaXNJbWFnZSkge1xuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnLCAnbGF6eScpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZy10ZW1wbGF0ZS1zdmcnKSk7XG4gICAgfVxuXG4gICAgbG9hZEltYWdlKGl0ZW0pO1xuICB9XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaW5WaWV3cG9ydChlbCkge1xuICBpZiAoIWVsLm9mZnNldFdpZHRoIHx8ICFlbC5vZmZzZXRIZWlnaHQgfHwgIWVsLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciB3aWR0aCA9IE1hdGgubWluKHJvb3QuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWluKHJvb3QuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gcmVjdC5ib3R0b20gPj0gMCAmJiByZWN0LnJpZ2h0ID49IDAgJiYgcmVjdC50b3AgPD0gaGVpZ2h0ICYmIHJlY3QubGVmdCA8PSB3aWR0aDtcbn1cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2l6ZVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdpZHRoXG4gKiBAcHJvcGVydHkge051bWJlcn0gaGVpZ2h0XG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRvIHR1cm4gYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhIFVSTC5cbiAqXG4gKiBAY2FsbGJhY2sgVGVtcGxhdGVSZW5kZXJlclxuICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZXR0aW5nc1xuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdGVtcGxhdGVdXG4gKiAgICAgICAgICAgQSB0ZW1wbGF0ZSBzdHJpbmcgdXNlZCB0byBnZW5lcmF0ZSBVUkxzIGZvciBhbiBpbWFnZS4gVGhpcyBhbGxvd3MgdXMgdG9cbiAqICAgICAgICAgICBkeW5hbWljYWxseSBsb2FkIGltYWdlcyB3aXRoIHNpemVzIHRvIG1hdGNoIHRoZSBjb250YWluZXIncyBzaXplLlxuICpcbiAqIEBwcm9wZXJ0eSB7VGVtcGxhdGVSZW5kZXJlcn0gW3RlbXBsYXRlUmVuZGVyXVxuICogICAgICAgICAgIEEgZnVuY3Rpb24gdG8gdHVybiBhIHRlbXBsYXRlIHN0cmluZyBpbnRvIGEgVVJMLlxuICpcbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gW21heF1cbiAqICAgICAgICAgICBUaGUgbWF4aW11bSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhlIGltYWdlLiBUaGlzIGVuc3VyZXMgd2UgZG9uJ3RcbiAqICAgICAgICAgICB0cnkgdG8gbG9hZCBhbiBpbWFnZSBsYXJnZXIgdGhhbiBpcyBwb3NzaWJsZS5cbiAqIFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzY2FsZV1cbiAqICAgICAgICAgICBBIG51bWJlciB0byBzY2FsZSB0aGUgZmluYWwgaW1hZ2UgZGltZW5zaW9ucyBieS4gXG4gKiAgICAgICAgICAgT25seSBhcHBsaWVzIHRvIGxhenktbG9hZGVkIGltYWdlcy4gRGVmYXVsdHMgdG8gMS5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gW3JvdW5kXVxuICogICAgICAgICAgIFJvdW5kIGltYWdlIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUuIFRoaXMgaXMgaW50ZW5kZWQgdG9cbiAqICAgICAgICAgICB0YXggdGhlIGltYWdlIHNlcnZlciBsZXNzIGJ5IGxvd2VyaW5nIHRoZSBudW1iZXIgb2YgcG9zc2libGUgaW1hZ2VcbiAqICAgICAgICAgICBzaXplcyByZXF1ZXN0ZWQuXG4gKlxuICogQHByb3BlcnR5IHtTaXplfSBbcGxhY2Vob2xkZXJdXG4gKiAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGxvLWZpIGltYWdlIHRvIGxvYWQgYmVmb3JlIHRoZSBmdWxsIGltYWdlLlxuICogXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW2Nyb3BdXG4gKiAgICAgICAgICAgQ3JvcCB2YWx1ZTsgbnVsbCBpZiBpbWFnZSBpcyB1bmNyb3BwZWQsIG90aGVyd2lzZSBlcXVhbCBcbiAqICAgICAgICAgICB0byB0aGUgU2hvcGlmeSBjcm9wIHBhcmFtZXRlciAoJ2NlbnRlcicsICd0b3AnLCBldGMuKS5cbiAqL1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHJlc3BvbnNpdmUgaW1hZ2UgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAqICAgICAgICBUaGUgQ1NTIHNlbGVjdG9yLCBlbGVtZW50LCBvciBlbGVtZW50cyB0byB0cmFjayBmb3IgbGF6eS1sb2FkaW5nLlxuICpcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7UHVibGljQXBpfVxuICovXG5cblxuZnVuY3Rpb24gcmltZygpIHtcbiAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZz1cImxhenlcIl0nO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307IC8vIEludGVyc2VjdGlvbnNcblxuICB2YXIgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcgfHwgZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSB7XG4gICAgICAgIGlvLnVub2JzZXJ2ZShlbnRyeS50YXJnZXQpO1xuICAgICAgICBsb2FkKGVudHJ5LnRhcmdldCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHtcbiAgICAvLyBXYXRjaCB0aGUgdmlld3BvcnQsIHdpdGggMjAlIHZlcnRpY2FsIG1hcmdpbnNcbiAgICByb290TWFyZ2luOiAnMjAlIDBweCdcbiAgfSk7XG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWJsaWNBcGlcbiAgICovXG5cbiAgdmFyIGFwaSA9IHtcbiAgICAvKipcbiAgICAgKiBUcmFjayBhIG5ldyBzZWxlY3RvciwgZWxlbWVudCwgb3Igbm9kZWxpc3QgZm9yIGxhenktbG9hZGluZy5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICAgICAqL1xuICAgIHRyYWNrOiBmdW5jdGlvbiB0cmFjaygpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJztcbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCBpcyBhbHJlYWR5IGluIHRoZSB2aWV3cG9ydCwgbG9hZCBpdCByaWdodCBhd2F5LiBUaGlzXG4gICAgICAgIC8vIGZpeGVzIGEgcmFjZS1jb25kaXRpb24gd2l0aCBkeW5hbWljYWxseSBhZGRlZCBlbGVtZW50cy5cbiAgICAgICAgaWYgKGluVmlld3BvcnQoZWxzW2ldKSkge1xuICAgICAgICAgIGxvYWQoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpby5vYnNlcnZlKGVsc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGVsZW1lbnQocykgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgdG8gZm9yY2UgdGhlaXIgaW1hZ2VzXG4gICAgICogdG8gYmUgcmVjYWxjdWxhdGVkLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUkMSgpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsb2FkZWRcIl0nO1xuICAgICAgdmFyIGVscyA9IHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cGRhdGUoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0cmFja2luZyBlbGVtZW50KHMpIGZvciBsYXp5LWxvYWRpbmcuXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAgICAgKi9cbiAgICB1bnRyYWNrOiBmdW5jdGlvbiB1bnRyYWNrKCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZ10nO1xuICAgICAgdmFyIGVscyA9IHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpby51bm9ic2VydmUoZWxzW2ldKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgbG9hZCBpbWFnZXMuXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbiBsb2FkJDEoKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nXSc7XG4gICAgICB2YXIgZWxzID0gcXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxvYWQoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkIGFsbCBldmVudCBoYW5kbGVycyBhbmQgb2JzZXJ2ZXJzLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICovXG4gICAgdW5sb2FkOiBmdW5jdGlvbiB1bmxvYWQoKSB7XG4gICAgICBpby5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9OyAvLyBBZGQgaW5pdGlhbCBlbGVtZW50c1xuXG4gIGFwaS50cmFjayhzZWxlY3Rvcik7XG4gIHJldHVybiBhcGk7XG59XG4vKipcbiAqIEZpbmRzIGEgZ3JvdXAgb2YgZWxlbWVudHMgb24gdGhlIHBhZ2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH1cblxuICBpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBbc2VsZWN0b3JdO1xuICB9XG5cbiAgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2YgTm9kZUxpc3QpIHtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cblxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogUG9seWZpbGwgZm9yIEVsZW1lbnQubWF0Y2hlcygpLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICovXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZnVuY3Rpb24gKHMpIHtcbiAgICB2YXIgbWF0Y2hlcyA9ICh0aGlzLmRvY3VtZW50IHx8IHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzKSxcbiAgICAgICAgaSA9IG1hdGNoZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKC0taSA+PSAwICYmIG1hdGNoZXMuaXRlbShpKSAhPT0gdGhpcykge31cblxuICAgIHJldHVybiBpID4gLTE7XG4gIH07XG59XG5cbnZhciBzdGF0ZSA9IHtcbiAgaW5pdDogaW5pdCxcbiAgd2F0Y2g6IHdhdGNoLFxuICB1bndhdGNoOiB1bndhdGNoLFxuICBsb2FkOiBsb2FkJDFcbn07XG5cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJztcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBzdGF0ZS5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICBzdGF0ZS5pbnN0YW5jZSA9IHJpbWcoc2VsZWN0b3IsIG9wdGlvbnMpO1xuICBzdGF0ZS5sb2FkZWRXaWR0aCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IC8vIExpc3RlbiBmb3IgU2hvcGlmeSB0aGVtZSBlZGl0b3IgZXZlbnRzXG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmxvYWQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gd2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgfSk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF91cGRhdGUoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjp1bmxvYWQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICB9KTsgLy8gTGlzdGVuIGZvciBjdXN0b20gZXZlbnRzIHRvIGFsbG93IHRoZW1lcyB0byBob29rIGludG8gcmltZ1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RoZW1lOnJpbWc6d2F0Y2gnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gd2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgfSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RoZW1lOnJpbWc6dW53YXRjaCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiB1bndhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pOyAvLyBTdXBwb3J0IGN1c3RvbSBldmVudHMgdHJpZ2dlcmVkIHRocm91Z2ggalF1ZXJ5XG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvaXNzdWVzLzMzNDdcblxuICBpZiAod2luZG93LmpRdWVyeSkge1xuICAgIGpRdWVyeShkb2N1bWVudCkub24oe1xuICAgICAgJ3RoZW1lOnJpbWc6d2F0Y2gnOiBmdW5jdGlvbiB0aGVtZVJpbWdXYXRjaChldmVudCkge1xuICAgICAgICByZXR1cm4gd2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICAndGhlbWU6cmltZzp1bndhdGNoJzogZnVuY3Rpb24gdGhlbWVSaW1nVW53YXRjaChldmVudCkge1xuICAgICAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIFRyYWNrIGFuIGVsZW1lbnQsIGFuZCBpdHMgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqL1xuXG5cbmZ1bmN0aW9uIHdhdGNoKGVsKSB7XG4gIC8vIFRyYWNrIGVsZW1lbnRcbiAgaWYgKHR5cGVvZiBlbC5tYXRjaGVzID09PSAnZnVuY3Rpb24nICYmIGVsLm1hdGNoZXMoc3RhdGUuc2VsZWN0b3IpKSB7XG4gICAgc3RhdGUuaW5zdGFuY2UudHJhY2soZWwpO1xuICB9IC8vIFRyYWNrIGVsZW1lbnQncyBjaGlsZHJlblxuXG5cbiAgc3RhdGUuaW5zdGFuY2UudHJhY2soZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpO1xufVxuLyoqXG4gKiBVbnRyYWNrIGFuIGVsZW1lbnQsIGFuZCBpdHMgY2hpbGRyZW5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIHVud2F0Y2goZWwpIHtcbiAgLy8gVW50cmFjayBlbGVtZW50J3MgY2hpbGRyZW5cbiAgc3RhdGUuaW5zdGFuY2UudW50cmFjayhlbC5xdWVyeVNlbGVjdG9yQWxsKHN0YXRlLnNlbGVjdG9yKSk7IC8vIFVudHJhY2sgZWxlbWVudFxuXG4gIGlmICh0eXBlb2YgZWwubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBlbC5tYXRjaGVzKHN0YXRlLnNlbGVjdG9yKSkge1xuICAgIHN0YXRlLmluc3RhbmNlLnVudHJhY2soZWwpO1xuICB9XG59XG4vKipcbiAqIE1hbnVhbGx5IGxvYWQgYW4gaW1hZ2VcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICovXG5cblxuZnVuY3Rpb24gbG9hZCQxKGVsKSB7XG4gIC8vIExvYWQgZWxlbWVudFxuICBpZiAodHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2hlcyhzdGF0ZS5zZWxlY3RvcikpIHtcbiAgICBzdGF0ZS5pbnN0YW5jZS5sb2FkKGVsKTtcbiAgfSAvLyBMb2FkIGVsZW1lbnQncyBjaGlsZHJlblxuXG5cbiAgc3RhdGUuaW5zdGFuY2UubG9hZChlbC5xdWVyeVNlbGVjdG9yQWxsKHN0YXRlLnNlbGVjdG9yKSk7XG59XG4vKipcbiAqIFVwZGF0ZSBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKi9cblxuXG5mdW5jdGlvbiBfdXBkYXRlKCkge1xuICB2YXIgY3VycmVudFdpZHRoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgLy8gUmV0dXJuIGlmIHdlJ3JlIG5vdCAyeCBzbWFsbGVyLCBvciBsYXJnZXIgdGhhbiB0aGUgZXhpc3RpbmcgbG9hZGluZyBzaXplXG5cbiAgaWYgKGN1cnJlbnRXaWR0aCAvIHN0YXRlLmxvYWRlZFdpZHRoID4gMC41ICYmIGN1cnJlbnRXaWR0aCAvIHN0YXRlLmxvYWRlZFdpZHRoIDwgMikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmxvYWRlZFdpZHRoID0gY3VycmVudFdpZHRoO1xuICBzdGF0ZS5pbnN0YW5jZS51cGRhdGUoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js ***!
+ \*********************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n /*!\n * @pixelunion/shopify-asyncview v2.0.5\n * (c) 2020 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar deferred = {};\n\nvar AsyncView = /*#__PURE__*/function () {\n function AsyncView() {\n _classCallCheck(this, AsyncView);\n }\n\n _createClass(AsyncView, null, [{\n key: \"load\",\n\n /**\n * Load the template given by the provided URL into the provided\n * view\n *\n * @param {string} url - The url to load\n * @param {object} query - An object containing additional query parameters of the URL\n * @param {string} query.view - A required query parameter indicating which view to load\n * @param {object} [options] - Config options\n * @param {string} [options.hash] - A hash of the current page content\n */\n value: function load(url) {\n var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!('view' in query)) {\n return Promise.reject(new Error('\\'view\\' not found in \\'query\\' parameter'));\n }\n\n var querylessUrl = url.replace(/\\?[^#]+/, '');\n var queryParamsString = new RegExp(/.+\\?([^#]+)/).exec(url);\n var queryParams = query;\n\n if (queryParamsString && queryParamsString.length >= 2) {\n queryParamsString[1].split('&').forEach(function (param) {\n var _param$split = param.split('='),\n _param$split2 = _slicedToArray(_param$split, 2),\n key = _param$split2[0],\n value = _param$split2[1];\n\n queryParams[key] = value;\n });\n } // NOTE: We're adding an additional timestamp to the query.\n // This is to prevent certain browsers from returning cached\n // versions of the url we are requesting.\n // See this PR for more info: https://github.com/pixelunion/shopify-asyncview/pull/4\n\n\n var cachebustingParams = _objectSpread2({}, queryParams, {\n _: new Date().getTime()\n });\n\n var hashUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n return \"\".concat(address, \"?\").concat(Object.keys(queryParams).sort().map(function (key) {\n return \"\".concat(key, \"=\").concat(encodeURIComponent(queryParams[key]));\n }).join('&')).concat(hash);\n });\n var requestUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n return \"\".concat(address, \"?\").concat(Object.keys(cachebustingParams).sort().map(function (key) {\n return \"\".concat(key, \"=\").concat(encodeURIComponent(cachebustingParams[key]));\n }).join('&')).concat(hash);\n });\n var promise = new Promise(function (resolve, reject) {\n var data;\n\n if (hashUrl in deferred) {\n resolve(deferred[hashUrl]);\n return;\n }\n\n deferred[hashUrl] = promise;\n\n if (options.hash) {\n data = sessionStorage.getItem(hashUrl);\n\n if (data) {\n var deserialized = JSON.parse(data);\n\n if (options.hash === deserialized.options.hash) {\n delete deferred[hashUrl];\n resolve(deserialized);\n return;\n }\n }\n }\n\n var xhr = new XMLHttpRequest();\n xhr.open('GET', requestUrl, true);\n\n xhr.onload = function () {\n var el = xhr.response;\n var newOptions = {};\n var optionsEl = el.querySelector('[data-options]');\n\n if (optionsEl && optionsEl.innerHTML) {\n newOptions = JSON.parse(el.querySelector('[data-options]').innerHTML);\n }\n\n var htmlEls = el.querySelectorAll('[data-html]');\n var newHtml = {};\n\n if (htmlEls.length === 1 && htmlEls[0].getAttribute('data-html') === '') {\n newHtml = htmlEls[0].innerHTML;\n } else {\n for (var i = 0; i < htmlEls.length; i++) {\n newHtml[htmlEls[i].getAttribute('data-html')] = htmlEls[i].innerHTML;\n }\n }\n\n var dataEls = el.querySelectorAll('[data-data]');\n var newData = {};\n\n if (dataEls.length === 1 && dataEls[0].getAttribute('data-data') === '') {\n newData = JSON.parse(dataEls[0].innerHTML);\n } else {\n for (var _i = 0; _i < dataEls.length; _i++) {\n newData[dataEls[_i].getAttribute('data-data')] = JSON.parse(dataEls[_i].innerHTML);\n }\n }\n\n if (options.hash) {\n try {\n sessionStorage.setItem(hashUrl, JSON.stringify({\n options: newOptions,\n data: newData,\n html: newHtml\n }));\n } catch (error) {\n console.error(error);\n }\n }\n\n delete deferred[hashUrl];\n resolve({\n data: newData,\n html: newHtml\n });\n };\n\n xhr.onerror = function () {\n delete deferred[hashUrl];\n reject();\n };\n\n xhr.responseType = 'document';\n xhr.send();\n });\n return promise;\n }\n }]);\n\n return AsyncView;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AsyncView);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvZGlzdC9pbmRleC5lcy5qcz8zMDBlIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAvKiFcbiAgICogQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcgdjIuMC41XG4gICAqIChjKSAyMDIwIFBpeGVsIFVuaW9uXG4gICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShuKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbnZhciBkZWZlcnJlZCA9IHt9O1xuXG52YXIgQXN5bmNWaWV3ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXN5bmNWaWV3KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY1ZpZXcpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jVmlldywgbnVsbCwgW3tcbiAgICBrZXk6IFwibG9hZFwiLFxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgdGVtcGxhdGUgZ2l2ZW4gYnkgdGhlIHByb3ZpZGVkIFVSTCBpbnRvIHRoZSBwcm92aWRlZFxuICAgICAqIHZpZXdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgdXJsIHRvIGxvYWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcXVlcnkgLSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMgb2YgdGhlIFVSTFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeS52aWV3IC0gQSByZXF1aXJlZCBxdWVyeSBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGljaCB2aWV3IHRvIGxvYWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gQ29uZmlnIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaGFzaF0gLSBBIGhhc2ggb2YgdGhlIGN1cnJlbnQgcGFnZSBjb250ZW50XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgcXVlcnkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgICBpZiAoISgndmlldycgaW4gcXVlcnkpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1xcJ3ZpZXdcXCcgbm90IGZvdW5kIGluIFxcJ3F1ZXJ5XFwnIHBhcmFtZXRlcicpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHF1ZXJ5bGVzc1VybCA9IHVybC5yZXBsYWNlKC9cXD9bXiNdKy8sICcnKTtcbiAgICAgIHZhciBxdWVyeVBhcmFtc1N0cmluZyA9IG5ldyBSZWdFeHAoLy4rXFw/KFteI10rKS8pLmV4ZWModXJsKTtcbiAgICAgIHZhciBxdWVyeVBhcmFtcyA9IHF1ZXJ5O1xuXG4gICAgICBpZiAocXVlcnlQYXJhbXNTdHJpbmcgJiYgcXVlcnlQYXJhbXNTdHJpbmcubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcXVlcnlQYXJhbXNTdHJpbmdbMV0uc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgIHZhciBfcGFyYW0kc3BsaXQgPSBwYXJhbS5zcGxpdCgnPScpLFxuICAgICAgICAgICAgICBfcGFyYW0kc3BsaXQyID0gX3NsaWNlZFRvQXJyYXkoX3BhcmFtJHNwbGl0LCAyKSxcbiAgICAgICAgICAgICAga2V5ID0gX3BhcmFtJHNwbGl0MlswXSxcbiAgICAgICAgICAgICAgdmFsdWUgPSBfcGFyYW0kc3BsaXQyWzFdO1xuXG4gICAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gTk9URTogV2UncmUgYWRkaW5nIGFuIGFkZGl0aW9uYWwgdGltZXN0YW1wIHRvIHRoZSBxdWVyeS5cbiAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCBjZXJ0YWluIGJyb3dzZXJzIGZyb20gcmV0dXJuaW5nIGNhY2hlZFxuICAgICAgLy8gdmVyc2lvbnMgb2YgdGhlIHVybCB3ZSBhcmUgcmVxdWVzdGluZy5cbiAgICAgIC8vIFNlZSB0aGlzIFBSIGZvciBtb3JlIGluZm86IGh0dHBzOi8vZ2l0aHViLmNvbS9waXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3L3B1bGwvNFxuXG5cbiAgICAgIHZhciBjYWNoZWJ1c3RpbmdQYXJhbXMgPSBfb2JqZWN0U3ByZWFkMih7fSwgcXVlcnlQYXJhbXMsIHtcbiAgICAgICAgXzogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgaGFzaFVybCA9IHF1ZXJ5bGVzc1VybC5yZXBsYWNlKC8oW14jXSspKC4qKS8sIGZ1bmN0aW9uIChtYXRjaCwgYWRkcmVzcywgaGFzaCkge1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoYWRkcmVzcywgXCI/XCIpLmNvbmNhdChPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykuc29ydCgpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQocXVlcnlQYXJhbXNba2V5XSkpO1xuICAgICAgICB9KS5qb2luKCcmJykpLmNvbmNhdChoYXNoKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHJlcXVlc3RVcmwgPSBxdWVyeWxlc3NVcmwucmVwbGFjZSgvKFteI10rKSguKikvLCBmdW5jdGlvbiAobWF0Y2gsIGFkZHJlc3MsIGhhc2gpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGFkZHJlc3MsIFwiP1wiKS5jb25jYXQoT2JqZWN0LmtleXMoY2FjaGVidXN0aW5nUGFyYW1zKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5LCBcIj1cIikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChjYWNoZWJ1c3RpbmdQYXJhbXNba2V5XSkpO1xuICAgICAgICB9KS5qb2luKCcmJykpLmNvbmNhdChoYXNoKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBkYXRhO1xuXG4gICAgICAgIGlmIChoYXNoVXJsIGluIGRlZmVycmVkKSB7XG4gICAgICAgICAgcmVzb2x2ZShkZWZlcnJlZFtoYXNoVXJsXSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmZXJyZWRbaGFzaFVybF0gPSBwcm9taXNlO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgICAgICBkYXRhID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShoYXNoVXJsKTtcblxuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzaCA9PT0gZGVzZXJpYWxpemVkLm9wdGlvbnMuaGFzaCkge1xuICAgICAgICAgICAgICBkZWxldGUgZGVmZXJyZWRbaGFzaFVybF07XG4gICAgICAgICAgICAgIHJlc29sdmUoZGVzZXJpYWxpemVkKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RVcmwsIHRydWUpO1xuXG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGVsID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgIHZhciBuZXdPcHRpb25zID0ge307XG4gICAgICAgICAgdmFyIG9wdGlvbnNFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9wdGlvbnNdJyk7XG5cbiAgICAgICAgICBpZiAob3B0aW9uc0VsICYmIG9wdGlvbnNFbC5pbm5lckhUTUwpIHtcbiAgICAgICAgICAgIG5ld09wdGlvbnMgPSBKU09OLnBhcnNlKGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9wdGlvbnNdJykuaW5uZXJIVE1MKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaHRtbEVscyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWh0bWxdJyk7XG4gICAgICAgICAgdmFyIG5ld0h0bWwgPSB7fTtcblxuICAgICAgICAgIGlmIChodG1sRWxzLmxlbmd0aCA9PT0gMSAmJiBodG1sRWxzWzBdLmdldEF0dHJpYnV0ZSgnZGF0YS1odG1sJykgPT09ICcnKSB7XG4gICAgICAgICAgICBuZXdIdG1sID0gaHRtbEVsc1swXS5pbm5lckhUTUw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRtbEVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBuZXdIdG1sW2h0bWxFbHNbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLWh0bWwnKV0gPSBodG1sRWxzW2ldLmlubmVySFRNTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZGF0YUVscyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRhdGFdJyk7XG4gICAgICAgICAgdmFyIG5ld0RhdGEgPSB7fTtcblxuICAgICAgICAgIGlmIChkYXRhRWxzLmxlbmd0aCA9PT0gMSAmJiBkYXRhRWxzWzBdLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRhJykgPT09ICcnKSB7XG4gICAgICAgICAgICBuZXdEYXRhID0gSlNPTi5wYXJzZShkYXRhRWxzWzBdLmlubmVySFRNTCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkYXRhRWxzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBuZXdEYXRhW2RhdGFFbHNbX2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRhJyldID0gSlNPTi5wYXJzZShkYXRhRWxzW19pXS5pbm5lckhUTUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oaGFzaFVybCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5ld09wdGlvbnMsXG4gICAgICAgICAgICAgICAgZGF0YTogbmV3RGF0YSxcbiAgICAgICAgICAgICAgICBodG1sOiBuZXdIdG1sXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZFtoYXNoVXJsXTtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGRhdGE6IG5ld0RhdGEsXG4gICAgICAgICAgICBodG1sOiBuZXdIdG1sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGVsZXRlIGRlZmVycmVkW2hhc2hVcmxdO1xuICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXN5bmNWaWV3O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBBc3luY1ZpZXc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn) {\n var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\nvar EventHandler_1 = createCommonjsModule(function (module, exports) {\n\nexports.__esModule = true;\n\nvar EventHandler =\n/** @class */\nfunction () {\n function EventHandler() {\n this.events = [];\n }\n\n EventHandler.prototype.register = function (el, event, listener) {\n if (!el || !event || !listener) return null;\n this.events.push({\n el: el,\n event: event,\n listener: listener\n });\n el.addEventListener(event, listener);\n return {\n el: el,\n event: event,\n listener: listener\n };\n };\n\n EventHandler.prototype.unregister = function (_a) {\n var el = _a.el,\n event = _a.event,\n listener = _a.listener;\n if (!el || !event || !listener) return null;\n this.events = this.events.filter(function (e) {\n return el !== e.el || event !== e.event || listener !== e.listener;\n });\n el.removeEventListener(event, listener);\n return {\n el: el,\n event: event,\n listener: listener\n };\n };\n\n EventHandler.prototype.unregisterAll = function () {\n this.events.forEach(function (_a) {\n var el = _a.el,\n event = _a.event,\n listener = _a.listener;\n return el.removeEventListener(event, listener);\n });\n this.events = [];\n };\n\n return EventHandler;\n}();\n\nexports[\"default\"] = EventHandler;\n});\n\nvar Events = /*@__PURE__*/getDefaultExportFromCjs(EventHandler_1);\n\nvar selectors = {\n disclosureList: '[data-disclosure-list]',\n disclosureToggle: '[data-disclosure-toggle]',\n disclosureInput: '[data-disclosure-input]',\n disclosureOptions: '[data-disclosure-option]'\n};\nvar classes = {\n listVisible: 'disclosure-list--visible',\n alternateDrop: 'disclosure-list--alternate-drop'\n};\n\nvar Disclosure = /*#__PURE__*/function () {\n function Disclosure(el) {\n _classCallCheck(this, Disclosure);\n\n this.el = el;\n this.events = new Events();\n this.cache = {};\n\n this._cacheSelectors();\n\n this._connectOptions();\n\n this._connectToggle();\n\n this._onFocusOut();\n }\n\n _createClass(Disclosure, [{\n key: \"_cacheSelectors\",\n value: function _cacheSelectors() {\n this.cache = {\n disclosureList: this.el.querySelector(selectors.disclosureList),\n disclosureToggle: this.el.querySelector(selectors.disclosureToggle),\n disclosureInput: this.el.querySelector(selectors.disclosureInput),\n disclosureOptions: this.el.querySelectorAll(selectors.disclosureOptions)\n };\n }\n }, {\n key: \"_connectToggle\",\n value: function _connectToggle() {\n var _this = this;\n\n this.events.register(this.cache.disclosureToggle, 'click', function (e) {\n var ariaExpanded = e.currentTarget.getAttribute('aria-expanded') === 'true';\n e.currentTarget.setAttribute('aria-expanded', !ariaExpanded);\n\n _this.cache.disclosureList.classList.remove(classes.alternateDrop);\n\n _this.cache.disclosureList.classList.toggle(classes.listVisible);\n\n window.requestAnimationFrame(function () {\n var _this$cache$disclosur = _this.cache.disclosureList.getBoundingClientRect(),\n left = _this$cache$disclosur.left,\n width = _this$cache$disclosur.width;\n\n var _window = window,\n innerWidth = _window.innerWidth;\n var gutter = 30;\n\n if (left + width + gutter > innerWidth) {\n _this.cache.disclosureList.classList.add(classes.alternateDrop);\n }\n });\n });\n }\n }, {\n key: \"_connectOptions\",\n value: function _connectOptions() {\n var _this2 = this;\n\n var options = this.cache.disclosureOptions;\n\n for (var i = 0; i < options.length; i++) {\n var option = options[i];\n this.events.register(option, 'click', function (e) {\n return _this2._submitForm(e.currentTarget.dataset.value);\n });\n }\n }\n }, {\n key: \"_onFocusOut\",\n value: function _onFocusOut() {\n var _this3 = this;\n\n this.events.register(this.cache.disclosureToggle, 'focusout', function (e) {\n var disclosureLostFocus = !_this3.el.contains(e.relatedTarget);\n\n if (disclosureLostFocus) {\n _this3._hideList();\n }\n });\n this.events.register(this.cache.disclosureList, 'focusout', function (e) {\n var childInFocus = e.currentTarget.contains(e.relatedTarget);\n\n var isVisible = _this3.cache.disclosureList.classList.contains(classes.listVisible);\n\n if (isVisible && !childInFocus) {\n _this3._hideList();\n }\n });\n this.events.register(this.el, 'keyup', function (e) {\n if (e.defaultPrevented) {\n return; // Do nothing if the event was already processed\n }\n\n if (e.key !== 'Escape' || e.key !== 'Esc') return;\n\n _this3._hideList();\n\n _this3.cache.disclosureToggle.focus();\n });\n this.events.register(document.body, 'click', function (e) {\n var isOption = _this3.el.contains(e.target);\n\n var isVisible = _this3.cache.disclosureList.classList.contains(classes.listVisible);\n\n if (isVisible && !isOption) {\n _this3._hideList();\n }\n });\n }\n }, {\n key: \"_submitForm\",\n value: function _submitForm(value) {\n this.cache.disclosureInput.value = value;\n this.el.closest('form').submit();\n }\n }, {\n key: \"_hideList\",\n value: function _hideList() {\n this.cache.disclosureList.classList.remove(classes.listVisible);\n this.cache.disclosureToggle.setAttribute('aria-expanded', false);\n }\n }, {\n key: \"unload\",\n value: function unload() {\n this.events.unregisterAll();\n }\n }]);\n\n return Disclosure;\n}();\n\nif (!Element.prototype.matches) {\n Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n}\n\nif (!Element.prototype.closest) {\n Element.prototype.closest = function closest(s) {\n var el = this;\n\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n };\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Disclosure);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1jcm9zcy1ib3JkZXIvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1jcm9zcy1ib3JkZXIvZGlzdC9pbmRleC5lcy5qcz9hZTI3Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4pIHtcbiAgdmFyIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfTtcblx0cmV0dXJuIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIEV2ZW50SGFuZGxlcl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgRXZlbnRIYW5kbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRIYW5kbGVyKCkge1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gIH1cblxuICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGVsLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpIHJldHVybiBudWxsO1xuICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgZWw6IGVsLFxuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gICAgfSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB7XG4gICAgICBlbDogZWwsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcjogbGlzdGVuZXJcbiAgICB9O1xuICB9O1xuXG4gIEV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5yZWdpc3RlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBlbCA9IF9hLmVsLFxuICAgICAgICBldmVudCA9IF9hLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgIGlmICghZWwgfHwgIWV2ZW50IHx8ICFsaXN0ZW5lcikgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlbCAhPT0gZS5lbCB8fCBldmVudCAhPT0gZS5ldmVudCB8fCBsaXN0ZW5lciAhPT0gZS5saXN0ZW5lcjtcbiAgICB9KTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsOiBlbCxcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lclxuICAgIH07XG4gIH07XG5cbiAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICB2YXIgZWwgPSBfYS5lbCxcbiAgICAgICAgICBldmVudCA9IF9hLmV2ZW50LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gIH07XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcbn0oKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudEhhbmRsZXI7XG59KTtcblxudmFyIEV2ZW50cyA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhFdmVudEhhbmRsZXJfMSk7XG5cbnZhciBzZWxlY3RvcnMgPSB7XG4gIGRpc2Nsb3N1cmVMaXN0OiAnW2RhdGEtZGlzY2xvc3VyZS1saXN0XScsXG4gIGRpc2Nsb3N1cmVUb2dnbGU6ICdbZGF0YS1kaXNjbG9zdXJlLXRvZ2dsZV0nLFxuICBkaXNjbG9zdXJlSW5wdXQ6ICdbZGF0YS1kaXNjbG9zdXJlLWlucHV0XScsXG4gIGRpc2Nsb3N1cmVPcHRpb25zOiAnW2RhdGEtZGlzY2xvc3VyZS1vcHRpb25dJ1xufTtcbnZhciBjbGFzc2VzID0ge1xuICBsaXN0VmlzaWJsZTogJ2Rpc2Nsb3N1cmUtbGlzdC0tdmlzaWJsZScsXG4gIGFsdGVybmF0ZURyb3A6ICdkaXNjbG9zdXJlLWxpc3QtLWFsdGVybmF0ZS1kcm9wJ1xufTtcblxudmFyIERpc2Nsb3N1cmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEaXNjbG9zdXJlKGVsKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc2Nsb3N1cmUpO1xuXG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcblxuICAgIHRoaXMuX2NhY2hlU2VsZWN0b3JzKCk7XG5cbiAgICB0aGlzLl9jb25uZWN0T3B0aW9ucygpO1xuXG4gICAgdGhpcy5fY29ubmVjdFRvZ2dsZSgpO1xuXG4gICAgdGhpcy5fb25Gb2N1c091dCgpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERpc2Nsb3N1cmUsIFt7XG4gICAga2V5OiBcIl9jYWNoZVNlbGVjdG9yc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FjaGVTZWxlY3RvcnMoKSB7XG4gICAgICB0aGlzLmNhY2hlID0ge1xuICAgICAgICBkaXNjbG9zdXJlTGlzdDogdGhpcy5lbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycy5kaXNjbG9zdXJlTGlzdCksXG4gICAgICAgIGRpc2Nsb3N1cmVUb2dnbGU6IHRoaXMuZWwucXVlcnlTZWxlY3RvcihzZWxlY3RvcnMuZGlzY2xvc3VyZVRvZ2dsZSksXG4gICAgICAgIGRpc2Nsb3N1cmVJbnB1dDogdGhpcy5lbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycy5kaXNjbG9zdXJlSW5wdXQpLFxuICAgICAgICBkaXNjbG9zdXJlT3B0aW9uczogdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycy5kaXNjbG9zdXJlT3B0aW9ucylcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jb25uZWN0VG9nZ2xlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jb25uZWN0VG9nZ2xlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5jYWNoZS5kaXNjbG9zdXJlVG9nZ2xlLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgYXJpYUV4cGFuZGVkID0gZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7XG4gICAgICAgIGUuY3VycmVudFRhcmdldC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAhYXJpYUV4cGFuZGVkKTtcblxuICAgICAgICBfdGhpcy5jYWNoZS5kaXNjbG9zdXJlTGlzdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzZXMuYWx0ZXJuYXRlRHJvcCk7XG5cbiAgICAgICAgX3RoaXMuY2FjaGUuZGlzY2xvc3VyZUxpc3QuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc2VzLmxpc3RWaXNpYmxlKTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY2FjaGUkZGlzY2xvc3VyID0gX3RoaXMuY2FjaGUuZGlzY2xvc3VyZUxpc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgIGxlZnQgPSBfdGhpcyRjYWNoZSRkaXNjbG9zdXIubGVmdCxcbiAgICAgICAgICAgICAgd2lkdGggPSBfdGhpcyRjYWNoZSRkaXNjbG9zdXIud2lkdGg7XG5cbiAgICAgICAgICB2YXIgX3dpbmRvdyA9IHdpbmRvdyxcbiAgICAgICAgICAgICAgaW5uZXJXaWR0aCA9IF93aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgICB2YXIgZ3V0dGVyID0gMzA7XG5cbiAgICAgICAgICBpZiAobGVmdCArIHdpZHRoICsgZ3V0dGVyID4gaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgX3RoaXMuY2FjaGUuZGlzY2xvc3VyZUxpc3QuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmFsdGVybmF0ZURyb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2Nvbm5lY3RPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jb25uZWN0T3B0aW9ucygpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuY2FjaGUuZGlzY2xvc3VyZU9wdGlvbnM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1tpXTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIob3B0aW9uLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX3N1Ym1pdEZvcm0oZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uRm9jdXNPdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uRm9jdXNPdXQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5jYWNoZS5kaXNjbG9zdXJlVG9nZ2xlLCAnZm9jdXNvdXQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgZGlzY2xvc3VyZUxvc3RGb2N1cyA9ICFfdGhpczMuZWwuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgICBpZiAoZGlzY2xvc3VyZUxvc3RGb2N1cykge1xuICAgICAgICAgIF90aGlzMy5faGlkZUxpc3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmNhY2hlLmRpc2Nsb3N1cmVMaXN0LCAnZm9jdXNvdXQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hpbGRJbkZvY3VzID0gZS5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCk7XG5cbiAgICAgICAgdmFyIGlzVmlzaWJsZSA9IF90aGlzMy5jYWNoZS5kaXNjbG9zdXJlTGlzdC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3Nlcy5saXN0VmlzaWJsZSk7XG5cbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhY2hpbGRJbkZvY3VzKSB7XG4gICAgICAgICAgX3RoaXMzLl9oaWRlTGlzdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuZWwsICdrZXl1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICByZXR1cm47IC8vIERvIG5vdGhpbmcgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUua2V5ICE9PSAnRXNjYXBlJyB8fCBlLmtleSAhPT0gJ0VzYycpIHJldHVybjtcblxuICAgICAgICBfdGhpczMuX2hpZGVMaXN0KCk7XG5cbiAgICAgICAgX3RoaXMzLmNhY2hlLmRpc2Nsb3N1cmVUb2dnbGUuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIoZG9jdW1lbnQuYm9keSwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGlzT3B0aW9uID0gX3RoaXMzLmVsLmNvbnRhaW5zKGUudGFyZ2V0KTtcblxuICAgICAgICB2YXIgaXNWaXNpYmxlID0gX3RoaXMzLmNhY2hlLmRpc2Nsb3N1cmVMaXN0LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc2VzLmxpc3RWaXNpYmxlKTtcblxuICAgICAgICBpZiAoaXNWaXNpYmxlICYmICFpc09wdGlvbikge1xuICAgICAgICAgIF90aGlzMy5faGlkZUxpc3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zdWJtaXRGb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zdWJtaXRGb3JtKHZhbHVlKSB7XG4gICAgICB0aGlzLmNhY2hlLmRpc2Nsb3N1cmVJbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5lbC5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9oaWRlTGlzdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGlkZUxpc3QoKSB7XG4gICAgICB0aGlzLmNhY2hlLmRpc2Nsb3N1cmVMaXN0LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlcy5saXN0VmlzaWJsZSk7XG4gICAgICB0aGlzLmNhY2hlLmRpc2Nsb3N1cmVUb2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEaXNjbG9zdXJlO1xufSgpO1xuXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcbn1cblxuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiBjbG9zZXN0KHMpIHtcbiAgICB2YXIgZWwgPSB0aGlzO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKGVsLm1hdGNoZXMocykpIHJldHVybiBlbDtcbiAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlO1xuICAgIH0gd2hpbGUgKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxKTtcblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjbG9zdXJlO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js":
+/*!***********************************************************************************************!*\
+ !*** ./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js ***!
+ \***********************************************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/shopify-sections-manager v1.0.0\n * (c) 2019 Pixel Union\n */\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nfunction triggerInstanceEvent(instance, eventName) {\n if (instance && instance[eventName]) {\n for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n instance[eventName].apply(instance, args);\n }\n}\n\nfunction loadData(el) {\n var dataEl = el.querySelector('[data-section-data]');\n if (!dataEl) return {};\n\n // Load data from attribute, or innerHTML\n var data = dataEl.getAttribute('data-section-data') || dataEl.innerHTML;\n\n try {\n return JSON.parse(data);\n } catch (error) {\n console.warn('Sections: invalid section data found. ' + error.message);\n return {};\n }\n}\n\nvar ShopifySectionsManager = function () {\n function ShopifySectionsManager() {\n classCallCheck(this, ShopifySectionsManager);\n\n this.handlers = {};\n this.instances = {};\n this._onSectionEvent = this._onSectionEvent.bind(this);\n\n document.addEventListener('shopify:section:load', this._onSectionEvent);\n document.addEventListener('shopify:section:unload', this._onSectionEvent);\n document.addEventListener('shopify:section:select', this._onSectionEvent);\n document.addEventListener('shopify:section:deselect', this._onSectionEvent);\n document.addEventListener('shopify:section:reorder', this._onSectionEvent);\n document.addEventListener('shopify:block:select', this._onSectionEvent);\n document.addEventListener('shopify:block:deselect', this._onSectionEvent);\n }\n\n /**\n * Stop listening for section events, and unbind all handlers.\n */\n\n\n createClass(ShopifySectionsManager, [{\n key: 'unbind',\n value: function unbind() {\n document.removeEventListener('shopify:section:load', this._onSectionEvent);\n document.removeEventListener('shopify:section:unload', this._onSectionEvent);\n document.removeEventListener('shopify:section:select', this._onSectionEvent);\n document.removeEventListener('shopify:section:deselect', this._onSectionEvent);\n document.removeEventListener('shopify:section:reorder', this._onSectionEvent);\n document.removeEventListener('shopify:block:select', this._onSectionEvent);\n document.removeEventListener('shopify:block:deselect', this._onSectionEvent);\n\n // Unload all instances\n for (var i = 0; i < this.instances.length; i++) {\n triggerInstanceEvent(this.instances[i], 'onSectionUnload');\n }\n\n this.handlers = {};\n this.instances = {};\n }\n\n /**\n * Register a section handler.\n *\n * @param {string} type\n * The section type to handle. The handler will be called for all\n * sections with this type.\n *\n * @param {function} handler\n * The handler function is passed information about a specific section\n * instance. The handler is expected to return an object that will be\n * associated with the section instance.\n *\n * Section handlers are passed an object with the following parameters:\n * {string} id\n * An ID that maps to a specific section instance. Typically the\n * section's filename for static sections, or a generated ID for\n * dynamic sections.\n *\n * {string} type\n * The section type, as supplied when registered.\n *\n * {Element} el\n * The root DOM element for the section instance.\n *\n * {Object} data\n * Data loaded from the section script element. Defaults to an\n * empty object.\n *\n * {Function} postMessage\n * A function that can be called to pass messages between sections.\n * The function should be called with a message \"name\", and\n * optionally some data.\n */\n\n }, {\n key: 'register',\n value: function register(type, handler) {\n if (this.handlers[type]) {\n console.warn('Sections: section handler already exists of type \\'' + type + '\\'.');\n }\n\n // Store the section handler\n this.handlers[type] = handler;\n\n // Init sections for this type\n this._initSections(type);\n }\n\n /**\n * Initialize sections already on the page.\n */\n\n }, {\n key: '_initSections',\n value: function _initSections(type) {\n // Fetch all existing sections of our type on the page\n var dataEls = document.querySelectorAll('[data-section-type=\"' + type + '\"]');\n if (!dataEls) return;\n\n // Create an instance for each section\n for (var i = 0; i < dataEls.length; i++) {\n var dataEl = dataEls[i];\n var el = dataEl.parentNode;\n\n // Get instance ID\n var idEl = el.querySelector('[data-section-id]');\n\n if (!idEl) {\n console.warn('Sections: unable to find section id for \\'' + type + '\\'.', el);\n return;\n }\n\n var sectionId = idEl.getAttribute('data-section-id');\n if (!sectionId) {\n console.warn('Sections: unable to find section id for \\'' + type + '\\'.', el);\n return;\n }\n\n this._createInstance(sectionId, el);\n }\n }\n }, {\n key: '_onSectionEvent',\n value: function _onSectionEvent(event) {\n var el = event.target;\n var sectionId = event.detail.sectionId;\n var blockId = event.detail.blockId;\n var instance = this.instances[sectionId];\n\n switch (event.type) {\n case 'shopify:section:load':\n this._createInstance(sectionId, el);\n break;\n\n case 'shopify:section:unload':\n triggerInstanceEvent(instance, 'onSectionUnload', { el: el, id: sectionId });\n delete this.instances[sectionId];\n break;\n\n case 'shopify:section:select':\n triggerInstanceEvent(instance, 'onSectionSelect', { el: el, id: sectionId });\n break;\n\n case 'shopify:section:deselect':\n triggerInstanceEvent(instance, 'onSectionDeselect', { el: el, id: sectionId });\n break;\n\n case 'shopify:section:reorder':\n triggerInstanceEvent(instance, 'onSectionReorder', { el: el, id: sectionId });\n break;\n\n case 'shopify:block:select':\n triggerInstanceEvent(instance, 'onSectionBlockSelect', { el: el, id: blockId });\n break;\n\n case 'shopify:block:deselect':\n triggerInstanceEvent(instance, 'onSectionBlockDeselect', { el: el, id: blockId });\n break;\n\n default:\n break;\n }\n }\n }, {\n key: '_postMessage',\n value: function _postMessage(name, data) {\n var _this = this;\n\n Object.keys(this.instances).forEach(function (id) {\n triggerInstanceEvent(_this.instances[id], 'onSectionMessage', name, data);\n });\n }\n }, {\n key: '_createInstance',\n value: function _createInstance(id, el) {\n var typeEl = el.querySelector('[data-section-type]');\n if (!typeEl) return;\n\n var type = typeEl.getAttribute('data-section-type');\n if (!type) return;\n\n var handler = this.handlers[type];\n if (!handler) {\n console.warn('Sections: unable to find section handler for type \\'' + type + '\\'.');\n return;\n }\n\n var data = loadData(el);\n var postMessage = this._postMessage.bind(this);\n\n this.instances[id] = handler({ id: id, type: type, el: el, data: data, postMessage: postMessage });\n }\n }]);\n return ShopifySectionsManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShopifySectionsManager);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyL2Rpc3Qvc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyLmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9zaG9waWZ5LXNlY3Rpb25zLW1hbmFnZXIvZGlzdC9zaG9waWZ5LXNlY3Rpb25zLW1hbmFnZXIuZXMuanM/MGRmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyIHYxLjAuMFxuICogKGMpIDIwMTkgUGl4ZWwgVW5pb25cbiAqL1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5mdW5jdGlvbiB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgZXZlbnROYW1lKSB7XG4gIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZVtldmVudE5hbWVdKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZVtldmVudE5hbWVdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkRGF0YShlbCkge1xuICB2YXIgZGF0YUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi1kYXRhXScpO1xuICBpZiAoIWRhdGFFbCkgcmV0dXJuIHt9O1xuXG4gIC8vIExvYWQgZGF0YSBmcm9tIGF0dHJpYnV0ZSwgb3IgaW5uZXJIVE1MXG4gIHZhciBkYXRhID0gZGF0YUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLWRhdGEnKSB8fCBkYXRhRWwuaW5uZXJIVE1MO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdTZWN0aW9uczogaW52YWxpZCBzZWN0aW9uIGRhdGEgZm91bmQuICcgKyBlcnJvci5tZXNzYWdlKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxudmFyIFNob3BpZnlTZWN0aW9uc01hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNob3BpZnlTZWN0aW9uc01hbmFnZXIoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2hvcGlmeVNlY3Rpb25zTWFuYWdlcik7XG5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcbiAgICB0aGlzLl9vblNlY3Rpb25FdmVudCA9IHRoaXMuX29uU2VjdGlvbkV2ZW50LmJpbmQodGhpcyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246bG9hZCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmRlc2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpyZW9yZGVyJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6YmxvY2s6ZGVzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIHNlY3Rpb24gZXZlbnRzLCBhbmQgdW5iaW5kIGFsbCBoYW5kbGVycy5cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTaG9waWZ5U2VjdGlvbnNNYW5hZ2VyLCBbe1xuICAgIGtleTogJ3VuYmluZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246cmVvcmRlcicsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcblxuICAgICAgLy8gVW5sb2FkIGFsbCBpbnN0YW5jZXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQodGhpcy5pbnN0YW5jZXNbaV0sICdvblNlY3Rpb25VbmxvYWQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHNlY3Rpb24gaGFuZGxlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogICAgICAgIFRoZSBzZWN0aW9uIHR5cGUgdG8gaGFuZGxlLiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsXG4gICAgICogICAgICAgIHNlY3Rpb25zIHdpdGggdGhpcyB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlclxuICAgICAqICAgICAgICBUaGUgaGFuZGxlciBmdW5jdGlvbiBpcyBwYXNzZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBzZWN0aW9uXG4gICAgICogICAgICAgIGluc3RhbmNlLiBUaGUgaGFuZGxlciBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZVxuICAgICAqICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiAgICAgICAgU2VjdGlvbiBoYW5kbGVycyBhcmUgcGFzc2VkIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICAgKiAgICAgICAgICB7c3RyaW5nfSBpZFxuICAgICAqICAgICAgICAgIEFuIElEIHRoYXQgbWFwcyB0byBhIHNwZWNpZmljIHNlY3Rpb24gaW5zdGFuY2UuIFR5cGljYWxseSB0aGVcbiAgICAgKiAgICAgICAgICBzZWN0aW9uJ3MgZmlsZW5hbWUgZm9yIHN0YXRpYyBzZWN0aW9ucywgb3IgYSBnZW5lcmF0ZWQgSUQgZm9yXG4gICAgICogICAgICAgICAgZHluYW1pYyBzZWN0aW9ucy5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtzdHJpbmd9IHR5cGVcbiAgICAgKiAgICAgICAgICBUaGUgc2VjdGlvbiB0eXBlLCBhcyBzdXBwbGllZCB3aGVuIHJlZ2lzdGVyZWQuXG4gICAgICpcbiAgICAgKiAgICAgICAgICB7RWxlbWVudH0gZWxcbiAgICAgKiAgICAgICAgICBUaGUgcm9vdCBET00gZWxlbWVudCBmb3IgdGhlIHNlY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiAgICAgICAgICB7T2JqZWN0fSBkYXRhXG4gICAgICogICAgICAgICAgRGF0YSBsb2FkZWQgZnJvbSB0aGUgc2VjdGlvbiBzY3JpcHQgZWxlbWVudC4gRGVmYXVsdHMgdG8gYW5cbiAgICAgKiAgICAgICAgICBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAgICAgICAgICB7RnVuY3Rpb259IHBvc3RNZXNzYWdlXG4gICAgICogICAgICAgICAgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gcGFzcyBtZXNzYWdlcyBiZXR3ZWVuIHNlY3Rpb25zLlxuICAgICAqICAgICAgICAgIFRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBtZXNzYWdlIFwibmFtZVwiLCBhbmRcbiAgICAgKiAgICAgICAgICBvcHRpb25hbGx5IHNvbWUgZGF0YS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncmVnaXN0ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3Rlcih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICBpZiAodGhpcy5oYW5kbGVyc1t0eXBlXSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NlY3Rpb25zOiBzZWN0aW9uIGhhbmRsZXIgYWxyZWFkeSBleGlzdHMgb2YgdHlwZSBcXCcnICsgdHlwZSArICdcXCcuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBzZWN0aW9uIGhhbmRsZXJcbiAgICAgIHRoaXMuaGFuZGxlcnNbdHlwZV0gPSBoYW5kbGVyO1xuXG4gICAgICAvLyBJbml0IHNlY3Rpb25zIGZvciB0aGlzIHR5cGVcbiAgICAgIHRoaXMuX2luaXRTZWN0aW9ucyh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHNlY3Rpb25zIGFscmVhZHkgb24gdGhlIHBhZ2UuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ19pbml0U2VjdGlvbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdFNlY3Rpb25zKHR5cGUpIHtcbiAgICAgIC8vIEZldGNoIGFsbCBleGlzdGluZyBzZWN0aW9ucyBvZiBvdXIgdHlwZSBvbiB0aGUgcGFnZVxuICAgICAgdmFyIGRhdGFFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zZWN0aW9uLXR5cGU9XCInICsgdHlwZSArICdcIl0nKTtcbiAgICAgIGlmICghZGF0YUVscykgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2UgZm9yIGVhY2ggc2VjdGlvblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBkYXRhRWwgPSBkYXRhRWxzW2ldO1xuICAgICAgICB2YXIgZWwgPSBkYXRhRWwucGFyZW50Tm9kZTtcblxuICAgICAgICAvLyBHZXQgaW5zdGFuY2UgSURcbiAgICAgICAgdmFyIGlkRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLWlkXScpO1xuXG4gICAgICAgIGlmICghaWRFbCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaWQgZm9yIFxcJycgKyB0eXBlICsgJ1xcJy4nLCBlbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY3Rpb25JZCA9IGlkRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNlY3Rpb24taWQnKTtcbiAgICAgICAgaWYgKCFzZWN0aW9uSWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1NlY3Rpb25zOiB1bmFibGUgdG8gZmluZCBzZWN0aW9uIGlkIGZvciBcXCcnICsgdHlwZSArICdcXCcuJywgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NyZWF0ZUluc3RhbmNlKHNlY3Rpb25JZCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19vblNlY3Rpb25FdmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblNlY3Rpb25FdmVudChldmVudCkge1xuICAgICAgdmFyIGVsID0gZXZlbnQudGFyZ2V0O1xuICAgICAgdmFyIHNlY3Rpb25JZCA9IGV2ZW50LmRldGFpbC5zZWN0aW9uSWQ7XG4gICAgICB2YXIgYmxvY2tJZCA9IGV2ZW50LmRldGFpbC5ibG9ja0lkO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXNbc2VjdGlvbklkXTtcblxuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJzpcbiAgICAgICAgICB0aGlzLl9jcmVhdGVJbnN0YW5jZShzZWN0aW9uSWQsIGVsKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvblVubG9hZCcsIHsgZWw6IGVsLCBpZDogc2VjdGlvbklkIH0pO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmluc3RhbmNlc1tzZWN0aW9uSWRdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uU2VsZWN0JywgeyBlbDogZWwsIGlkOiBzZWN0aW9uSWQgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOmRlc2VsZWN0JzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvbkRlc2VsZWN0JywgeyBlbDogZWwsIGlkOiBzZWN0aW9uSWQgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOnJlb3JkZXInOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uUmVvcmRlcicsIHsgZWw6IGVsLCBpZDogc2VjdGlvbklkIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvbkJsb2NrU2VsZWN0JywgeyBlbDogZWwsIGlkOiBibG9ja0lkIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6YmxvY2s6ZGVzZWxlY3QnOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uQmxvY2tEZXNlbGVjdCcsIHsgZWw6IGVsLCBpZDogYmxvY2tJZCB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19wb3N0TWVzc2FnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wb3N0TWVzc2FnZShuYW1lLCBkYXRhKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoX3RoaXMuaW5zdGFuY2VzW2lkXSwgJ29uU2VjdGlvbk1lc3NhZ2UnLCBuYW1lLCBkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19jcmVhdGVJbnN0YW5jZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jcmVhdGVJbnN0YW5jZShpZCwgZWwpIHtcbiAgICAgIHZhciB0eXBlRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLXR5cGVdJyk7XG4gICAgICBpZiAoIXR5cGVFbCkgcmV0dXJuO1xuXG4gICAgICB2YXIgdHlwZSA9IHR5cGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VjdGlvbi10eXBlJyk7XG4gICAgICBpZiAoIXR5cGUpIHJldHVybjtcblxuICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaGFuZGxlciBmb3IgdHlwZSBcXCcnICsgdHlwZSArICdcXCcuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGEgPSBsb2FkRGF0YShlbCk7XG4gICAgICB2YXIgcG9zdE1lc3NhZ2UgPSB0aGlzLl9wb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLmluc3RhbmNlc1tpZF0gPSBoYW5kbGVyKHsgaWQ6IGlkLCB0eXBlOiB0eXBlLCBlbDogZWwsIGRhdGE6IGRhdGEsIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZSB9KTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js ***!
+ \***************************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nconst LOCAL_STORAGE_KEY = 'pxu-shopify-surface-pick-up';\nconst loadingClass = 'surface-pick-up--loading';\n\nconst isNotExpired = timestamp => timestamp + 1000 * 60 * 60 >= Date.now();\n\nconst removeTrailingSlash = s => s.replace(/(.*)\\/$/, '$1'); // Haversine Distance\n// The haversine formula is an equation giving great-circle distances between\n// two points on a sphere from their longitudes and latitudes\n\n\nfunction calculateDistance(latitude1, longitude1, latitude2, longitude2, unitSystem) {\n const dtor = Math.PI / 180;\n const radius = unitSystem === 'metric' ? 6378.14 : 3959;\n const rlat1 = latitude1 * dtor;\n const rlong1 = longitude1 * dtor;\n const rlat2 = latitude2 * dtor;\n const rlong2 = longitude2 * dtor;\n const dlon = rlong1 - rlong2;\n const dlat = rlat1 - rlat2;\n const a = Math.sin(dlat / 2) ** 2 + Math.cos(rlat1) * Math.cos(rlat2) * Math.sin(dlon / 2) ** 2;\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return radius * c;\n}\n\nasync function getGeoLocation() {\n return new Promise((resolve, reject) => {\n const options = {\n maximumAge: 3600000,\n // 1 hour\n timeout: 5000\n };\n\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(({\n coords\n }) => resolve(coords), reject, options);\n } else {\n reject();\n }\n });\n}\n\nasync function setLocation({\n latitude,\n longitude\n}) {\n const newData = {\n latitude,\n longitude,\n timestamp: Date.now()\n };\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(newData));\n return fetch('/localization.json', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n latitude,\n longitude\n })\n }).then(() => ({\n latitude,\n longitude\n }));\n}\n\nasync function getLocation(requestLocation = false) {\n const cachedLocation = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY));\n\n if (cachedLocation && isNotExpired(cachedLocation.timestamp)) {\n return cachedLocation;\n }\n\n if (requestLocation) {\n return getGeoLocation().then(coords => {\n setLocation(coords); // We don't need to wait for this\n\n return coords;\n });\n }\n\n return null;\n}\n\nclass SurfacePickUp {\n constructor(el, options) {\n this.el = el;\n this.options = {\n root_url: window.Theme && window.Theme.routes && window.Theme.routes.root_url || '',\n ...options\n };\n this.options.root_url = removeTrailingSlash(this.options.root_url);\n this.callbacks = [];\n this.onBtnPress = null;\n this.latestVariantId = null;\n }\n\n load(variantId) {\n // If no variant is available, empty element and quick-return\n if (!variantId) {\n this.el.innerHTML = '';\n return Promise.resolve(true);\n } // Because Shopify doesn't expose any `pick_up_enabled` data on the shop object, we\n // don't know if the variant might be, or is definitely not available for pick up.\n // Until we know the shop has > 0 pick up locations, we want to avoid prompting the\n // user for location data (it's annoying, and only makes sense to do if we use it).\n //\n // Instead, we have to make an initial request, check and see if any pick up locations\n // were returned, then ask for the users location, then make another request to get the\n // location-aware pick up locations.\n //\n // As far as I can tell the pick up aware locations differ only in sort order - which\n // we could do on the front end - but we're following this approach to ensure future\n // compatibility with any changes Shopify makes (maybe disabling options based on\n // user location, or whatever else).\n //\n // Shopify has indicated they will look into adding pick_up_enabled data to the shop\n // object, which which case this method can be greatly simplifed into 2 simple cases.\n\n\n this.latestVariantId = variantId;\n this.el.classList.add(loadingClass);\n return this._getData(variantId).then(data => this._injectData(data));\n }\n\n onModalRequest(callback) {\n if (this.callbacks.indexOf(callback) >= 0) return;\n this.callbacks.push(callback);\n }\n\n offModalRequest(callback) {\n this.callbacks.splice(this.callbacks.indexOf(callback));\n }\n\n unload() {\n this.callbacks = [];\n this.el.innerHTML = '';\n }\n\n _getData(variantId) {\n return new Promise(resolve => {\n const xhr = new XMLHttpRequest();\n const requestUrl = `${this.options.root_url}/variants/${variantId}/?section_id=surface-pick-up`;\n xhr.open('GET', requestUrl, true);\n\n xhr.onload = () => {\n const el = xhr.response;\n const embed = el.querySelector('[data-html=\"surface-pick-up-embed\"]');\n const itemsContainer = el.querySelector('[data-html=\"surface-pick-up-items\"]');\n const items = itemsContainer.content.querySelectorAll('[data-surface-pick-up-item]');\n resolve({\n embed,\n itemsContainer,\n items,\n variantId\n });\n };\n\n xhr.onerror = () => {\n resolve({\n embed: {\n innerHTML: ''\n },\n itemsContainer: {\n innerHTML: ''\n },\n items: [],\n variantId\n });\n };\n\n xhr.responseType = 'document';\n xhr.send();\n });\n }\n\n _injectData({\n embed,\n itemsContainer,\n items,\n variantId\n }) {\n if (variantId !== this.latestVariantId || items.length === 0) {\n this.el.innerHTML = '';\n this.el.classList.remove(loadingClass);\n return;\n }\n\n this.el.innerHTML = embed.innerHTML;\n this.el.classList.remove(loadingClass);\n let calculatedDistances = false;\n\n const calculateDistances = () => {\n if (calculatedDistances) return Promise.resolve();\n return getLocation(true).then(coords => {\n items.forEach(item => {\n const distanceEl = item.querySelector('[data-distance]');\n const distanceUnitEl = item.querySelector('[data-distance-unit]');\n const unitSystem = distanceUnitEl.dataset.distanceUnit;\n const itemLatitude = parseFloat(distanceEl.dataset.latitude);\n const itemLongitude = parseFloat(distanceEl.dataset.longitude);\n\n if (coords && isFinite(itemLatitude) && isFinite(itemLongitude)) {\n const distance = calculateDistance(coords.latitude, coords.longitude, itemLatitude, itemLongitude, unitSystem);\n distanceEl.innerHTML = distance.toFixed(1);\n } else {\n distanceEl.remove();\n distanceUnitEl.remove();\n }\n });\n }).catch(e => {\n console.log(e);\n items.forEach(item => {\n const distanceEl = item.querySelector('[data-distance]');\n const distanceUnitEl = item.querySelector('[data-distance-unit]');\n distanceEl.remove();\n distanceUnitEl.remove();\n });\n }).finally(() => {\n calculatedDistances = true;\n });\n };\n\n this.el.querySelector('[data-surface-pick-up-embed-modal-btn]').addEventListener('click', () => {\n calculateDistances().then(() => this.callbacks.forEach(callback => callback(itemsContainer.innerHTML)));\n });\n }\n\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SurfacePickUp);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zdXJmYWNlLXBpY2stdXAvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zdXJmYWNlLXBpY2stdXAvZGlzdC9pbmRleC5lcy5qcz83YWU5Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IExPQ0FMX1NUT1JBR0VfS0VZID0gJ3B4dS1zaG9waWZ5LXN1cmZhY2UtcGljay11cCc7XG5jb25zdCBsb2FkaW5nQ2xhc3MgPSAnc3VyZmFjZS1waWNrLXVwLS1sb2FkaW5nJztcblxuY29uc3QgaXNOb3RFeHBpcmVkID0gdGltZXN0YW1wID0+IHRpbWVzdGFtcCArIDEwMDAgKiA2MCAqIDYwID49IERhdGUubm93KCk7XG5cbmNvbnN0IHJlbW92ZVRyYWlsaW5nU2xhc2ggPSBzID0+IHMucmVwbGFjZSgvKC4qKVxcLyQvLCAnJDEnKTsgLy8gSGF2ZXJzaW5lIERpc3RhbmNlXG4vLyBUaGUgaGF2ZXJzaW5lIGZvcm11bGEgaXMgYW4gZXF1YXRpb24gZ2l2aW5nIGdyZWF0LWNpcmNsZSBkaXN0YW5jZXMgYmV0d2VlblxuLy8gdHdvIHBvaW50cyBvbiBhIHNwaGVyZSBmcm9tIHRoZWlyIGxvbmdpdHVkZXMgYW5kIGxhdGl0dWRlc1xuXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZURpc3RhbmNlKGxhdGl0dWRlMSwgbG9uZ2l0dWRlMSwgbGF0aXR1ZGUyLCBsb25naXR1ZGUyLCB1bml0U3lzdGVtKSB7XG4gIGNvbnN0IGR0b3IgPSBNYXRoLlBJIC8gMTgwO1xuICBjb25zdCByYWRpdXMgPSB1bml0U3lzdGVtID09PSAnbWV0cmljJyA/IDYzNzguMTQgOiAzOTU5O1xuICBjb25zdCBybGF0MSA9IGxhdGl0dWRlMSAqIGR0b3I7XG4gIGNvbnN0IHJsb25nMSA9IGxvbmdpdHVkZTEgKiBkdG9yO1xuICBjb25zdCBybGF0MiA9IGxhdGl0dWRlMiAqIGR0b3I7XG4gIGNvbnN0IHJsb25nMiA9IGxvbmdpdHVkZTIgKiBkdG9yO1xuICBjb25zdCBkbG9uID0gcmxvbmcxIC0gcmxvbmcyO1xuICBjb25zdCBkbGF0ID0gcmxhdDEgLSBybGF0MjtcbiAgY29uc3QgYSA9IE1hdGguc2luKGRsYXQgLyAyKSAqKiAyICsgTWF0aC5jb3MocmxhdDEpICogTWF0aC5jb3MocmxhdDIpICogTWF0aC5zaW4oZGxvbiAvIDIpICoqIDI7XG4gIGNvbnN0IGMgPSAyICogTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksIE1hdGguc3FydCgxIC0gYSkpO1xuICByZXR1cm4gcmFkaXVzICogYztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24oKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG1heGltdW1BZ2U6IDM2MDAwMDAsXG4gICAgICAvLyAxIGhvdXJcbiAgICAgIHRpbWVvdXQ6IDUwMDBcbiAgICB9O1xuXG4gICAgaWYgKG5hdmlnYXRvci5nZW9sb2NhdGlvbikge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigoe1xuICAgICAgICBjb29yZHNcbiAgICAgIH0pID0+IHJlc29sdmUoY29vcmRzKSwgcmVqZWN0LCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVqZWN0KCk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0TG9jYXRpb24oe1xuICBsYXRpdHVkZSxcbiAgbG9uZ2l0dWRlXG59KSB7XG4gIGNvbnN0IG5ld0RhdGEgPSB7XG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobmV3RGF0YSkpO1xuICByZXR1cm4gZmV0Y2goJy9sb2NhbGl6YXRpb24uanNvbicsIHtcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlXG4gICAgfSlcbiAgfSkudGhlbigoKSA9PiAoe1xuICAgIGxhdGl0dWRlLFxuICAgIGxvbmdpdHVkZVxuICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uKHJlcXVlc3RMb2NhdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlZExvY2F0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSkpO1xuXG4gIGlmIChjYWNoZWRMb2NhdGlvbiAmJiBpc05vdEV4cGlyZWQoY2FjaGVkTG9jYXRpb24udGltZXN0YW1wKSkge1xuICAgIHJldHVybiBjYWNoZWRMb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChyZXF1ZXN0TG9jYXRpb24pIHtcbiAgICByZXR1cm4gZ2V0R2VvTG9jYXRpb24oKS50aGVuKGNvb3JkcyA9PiB7XG4gICAgICBzZXRMb2NhdGlvbihjb29yZHMpOyAvLyBXZSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHRoaXNcblxuICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jbGFzcyBTdXJmYWNlUGlja1VwIHtcbiAgY29uc3RydWN0b3IoZWwsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgcm9vdF91cmw6IHdpbmRvdy5UaGVtZSAmJiB3aW5kb3cuVGhlbWUucm91dGVzICYmIHdpbmRvdy5UaGVtZS5yb3V0ZXMucm9vdF91cmwgfHwgJycsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnMucm9vdF91cmwgPSByZW1vdmVUcmFpbGluZ1NsYXNoKHRoaXMub3B0aW9ucy5yb290X3VybCk7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLm9uQnRuUHJlc3MgPSBudWxsO1xuICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gbnVsbDtcbiAgfVxuXG4gIGxvYWQodmFyaWFudElkKSB7XG4gICAgLy8gSWYgbm8gdmFyaWFudCBpcyBhdmFpbGFibGUsIGVtcHR5IGVsZW1lbnQgYW5kIHF1aWNrLXJldHVyblxuICAgIGlmICghdmFyaWFudElkKSB7XG4gICAgICB0aGlzLmVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9IC8vIEJlY2F1c2UgU2hvcGlmeSBkb2Vzbid0IGV4cG9zZSBhbnkgYHBpY2tfdXBfZW5hYmxlZGAgZGF0YSBvbiB0aGUgc2hvcCBvYmplY3QsIHdlXG4gICAgLy8gZG9uJ3Qga25vdyBpZiB0aGUgdmFyaWFudCBtaWdodCBiZSwgb3IgaXMgZGVmaW5pdGVseSBub3QgYXZhaWxhYmxlIGZvciBwaWNrIHVwLlxuICAgIC8vIFVudGlsIHdlIGtub3cgdGhlIHNob3AgaGFzID4gMCBwaWNrIHVwIGxvY2F0aW9ucywgd2Ugd2FudCB0byBhdm9pZCBwcm9tcHRpbmcgdGhlXG4gICAgLy8gdXNlciBmb3IgbG9jYXRpb24gZGF0YSAoaXQncyBhbm5veWluZywgYW5kIG9ubHkgbWFrZXMgc2Vuc2UgdG8gZG8gaWYgd2UgdXNlIGl0KS5cbiAgICAvL1xuICAgIC8vIEluc3RlYWQsIHdlIGhhdmUgdG8gbWFrZSBhbiBpbml0aWFsIHJlcXVlc3QsIGNoZWNrIGFuZCBzZWUgaWYgYW55IHBpY2sgdXAgbG9jYXRpb25zXG4gICAgLy8gd2VyZSByZXR1cm5lZCwgdGhlbiBhc2sgZm9yIHRoZSB1c2VycyBsb2NhdGlvbiwgdGhlbiBtYWtlIGFub3RoZXIgcmVxdWVzdCB0byBnZXQgdGhlXG4gICAgLy8gbG9jYXRpb24tYXdhcmUgcGljayB1cCBsb2NhdGlvbnMuXG4gICAgLy9cbiAgICAvLyBBcyBmYXIgYXMgSSBjYW4gdGVsbCB0aGUgcGljayB1cCBhd2FyZSBsb2NhdGlvbnMgZGlmZmVyIG9ubHkgaW4gc29ydCBvcmRlciAtIHdoaWNoXG4gICAgLy8gd2UgY291bGQgZG8gb24gdGhlIGZyb250IGVuZCAtIGJ1dCB3ZSdyZSBmb2xsb3dpbmcgdGhpcyBhcHByb2FjaCB0byBlbnN1cmUgZnV0dXJlXG4gICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGFueSBjaGFuZ2VzIFNob3BpZnkgbWFrZXMgKG1heWJlIGRpc2FibGluZyBvcHRpb25zIGJhc2VkIG9uXG4gICAgLy8gdXNlciBsb2NhdGlvbiwgb3Igd2hhdGV2ZXIgZWxzZSkuXG4gICAgLy9cbiAgICAvLyBTaG9waWZ5IGhhcyBpbmRpY2F0ZWQgdGhleSB3aWxsIGxvb2sgaW50byBhZGRpbmcgcGlja191cF9lbmFibGVkIGRhdGEgdG8gdGhlIHNob3BcbiAgICAvLyBvYmplY3QsIHdoaWNoIHdoaWNoIGNhc2UgdGhpcyBtZXRob2QgY2FuIGJlIGdyZWF0bHkgc2ltcGxpZmVkIGludG8gMiBzaW1wbGUgY2FzZXMuXG5cblxuICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gdmFyaWFudElkO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZChsb2FkaW5nQ2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl9nZXREYXRhKHZhcmlhbnRJZCkudGhlbihkYXRhID0+IHRoaXMuX2luamVjdERhdGEoZGF0YSkpO1xuICB9XG5cbiAgb25Nb2RhbFJlcXVlc3QoY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjaykgPj0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgb2ZmTW9kYWxSZXF1ZXN0KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBfZ2V0RGF0YSh2YXJpYW50SWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBgJHt0aGlzLm9wdGlvbnMucm9vdF91cmx9L3ZhcmlhbnRzLyR7dmFyaWFudElkfS8/c2VjdGlvbl9pZD1zdXJmYWNlLXBpY2stdXBgO1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RVcmwsIHRydWUpO1xuXG4gICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgY29uc3QgZW1iZWQgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1odG1sPVwic3VyZmFjZS1waWNrLXVwLWVtYmVkXCJdJyk7XG4gICAgICAgIGNvbnN0IGl0ZW1zQ29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaHRtbD1cInN1cmZhY2UtcGljay11cC1pdGVtc1wiXScpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IGl0ZW1zQ29udGFpbmVyLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3VyZmFjZS1waWNrLXVwLWl0ZW1dJyk7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIGVtYmVkLFxuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIHZhcmlhbnRJZFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBlbWJlZDoge1xuICAgICAgICAgICAgaW5uZXJIVE1MOiAnJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXRlbXNDb250YWluZXI6IHtcbiAgICAgICAgICAgIGlubmVySFRNTDogJydcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICB2YXJpYW50SWRcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG4gIH1cblxuICBfaW5qZWN0RGF0YSh7XG4gICAgZW1iZWQsXG4gICAgaXRlbXNDb250YWluZXIsXG4gICAgaXRlbXMsXG4gICAgdmFyaWFudElkXG4gIH0pIHtcbiAgICBpZiAodmFyaWFudElkICE9PSB0aGlzLmxhdGVzdFZhcmlhbnRJZCB8fCBpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUobG9hZGluZ0NsYXNzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVsLmlubmVySFRNTCA9IGVtYmVkLmlubmVySFRNTDtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUobG9hZGluZ0NsYXNzKTtcbiAgICBsZXQgY2FsY3VsYXRlZERpc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsY3VsYXRlRGlzdGFuY2VzID0gKCkgPT4ge1xuICAgICAgaWYgKGNhbGN1bGF0ZWREaXN0YW5jZXMpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIHJldHVybiBnZXRMb2NhdGlvbih0cnVlKS50aGVuKGNvb3JkcyA9PiB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VFbCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtZGlzdGFuY2VdJyk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VVbml0RWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlLXVuaXRdJyk7XG4gICAgICAgICAgY29uc3QgdW5pdFN5c3RlbSA9IGRpc3RhbmNlVW5pdEVsLmRhdGFzZXQuZGlzdGFuY2VVbml0O1xuICAgICAgICAgIGNvbnN0IGl0ZW1MYXRpdHVkZSA9IHBhcnNlRmxvYXQoZGlzdGFuY2VFbC5kYXRhc2V0LmxhdGl0dWRlKTtcbiAgICAgICAgICBjb25zdCBpdGVtTG9uZ2l0dWRlID0gcGFyc2VGbG9hdChkaXN0YW5jZUVsLmRhdGFzZXQubG9uZ2l0dWRlKTtcblxuICAgICAgICAgIGlmIChjb29yZHMgJiYgaXNGaW5pdGUoaXRlbUxhdGl0dWRlKSAmJiBpc0Zpbml0ZShpdGVtTG9uZ2l0dWRlKSkge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBjYWxjdWxhdGVEaXN0YW5jZShjb29yZHMubGF0aXR1ZGUsIGNvb3Jkcy5sb25naXR1ZGUsIGl0ZW1MYXRpdHVkZSwgaXRlbUxvbmdpdHVkZSwgdW5pdFN5c3RlbSk7XG4gICAgICAgICAgICBkaXN0YW5jZUVsLmlubmVySFRNTCA9IGRpc3RhbmNlLnRvRml4ZWQoMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3RhbmNlRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICBkaXN0YW5jZVVuaXRFbC5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlXScpO1xuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlVW5pdEVsID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kaXN0YW5jZS11bml0XScpO1xuICAgICAgICAgIGRpc3RhbmNlRWwucmVtb3ZlKCk7XG4gICAgICAgICAgZGlzdGFuY2VVbml0RWwucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGNhbGN1bGF0ZWREaXN0YW5jZXMgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc3VyZmFjZS1waWNrLXVwLWVtYmVkLW1vZGFsLWJ0bl0nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNhbGN1bGF0ZURpc3RhbmNlcygpLnRoZW4oKCkgPT4gdGhpcy5jYWxsYmFja3MuZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayhpdGVtc0NvbnRhaW5lci5pbm5lckhUTUwpKSk7XG4gICAgfSk7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTdXJmYWNlUGlja1VwO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@shopify/theme-addresses/theme-addresses.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@shopify/theme-addresses/theme-addresses.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CountryProvinceSelector\": () => (/* binding */ CountryProvinceSelector)\n/* harmony export */ });\n/**\n * CountryProvinceSelector Constructor\n * @param {String} countryOptions the country options in html string\n */\nfunction CountryProvinceSelector(countryOptions) {\n if (typeof countryOptions !== 'string') {\n throw new TypeError(countryOptions + ' is not a string.');\n }\n this.countryOptions = countryOptions;\n}\n\n/**\n * Builds the country and province selector with the given node element\n * @param {Node} countryNodeElement The <select> element for country\n * @param {Node} provinceNodeElement The <select> element for province\n * @param {Object} options Additional settings available\n * @param {CountryProvinceSelector~onCountryChange} options.onCountryChange callback after a country `change` event\n * @param {CountryProvinceSelector~onProvinceChange} options.onProvinceChange callback after a province `change` event\n */\nCountryProvinceSelector.prototype.build = function (countryNodeElement, provinceNodeElement, options) {\n if (typeof countryNodeElement !== 'object') {\n throw new TypeError(countryNodeElement + ' is not a object.');\n }\n\n if (typeof provinceNodeElement !== 'object') {\n throw new TypeError(provinceNodeElement + ' is not a object.');\n }\n\n var defaultValue = countryNodeElement.getAttribute('data-default');\n options = options || {}\n\n countryNodeElement.innerHTML = this.countryOptions;\n countryNodeElement.value = defaultValue;\n\n if (defaultValue && getOption(countryNodeElement, defaultValue)) {\n var provinces = buildProvince(countryNodeElement, provinceNodeElement, defaultValue);\n options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n }\n\n // Listen for value change on the country select\n countryNodeElement.addEventListener('change', function (event) {\n var target = event.target;\n var selectedValue = target.value;\n \n var provinces = buildProvince(target, provinceNodeElement, selectedValue);\n options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n });\n\n options.onProvinceChange && provinceNodeElement.addEventListener('change', options.onProvinceChange);\n}\n\n/**\n * This callback is called after a user interacted with a country `<select>`\n * @callback CountryProvinceSelector~onCountryChange\n * @param {array} provinces the parsed provinces\n * @param {Node} provinceNodeElement province `<select>` element\n * @param {Node} countryNodeElement country `<select>` element\n */\n\n /**\n * This callback is called after a user interacted with a province `<select>`\n * @callback CountryProvinceSelector~onProvinceChange\n * @param {Event} event the province selector `change` event object\n */\n\n/**\n * Returns the <option> with the specified value from the\n * given node element\n * A null is returned if no such <option> is found\n */\nfunction getOption(nodeElement, value) {\n return nodeElement.querySelector('option[value=\"' + value +'\"]')\n}\n\n/**\n * Builds the options for province selector\n */\nfunction buildOptions (provinceNodeElement, provinces) {\n var defaultValue = provinceNodeElement.getAttribute('data-default');\n\n provinces.forEach(function (option) {\n var optionElement = document.createElement('option');\n optionElement.value = option[0];\n optionElement.textContent = option[1];\n\n provinceNodeElement.appendChild(optionElement);\n })\n\n if (defaultValue && getOption(provinceNodeElement, defaultValue)) {\n provinceNodeElement.value = defaultValue;\n }\n}\n\n/**\n * Builds the province selector\n */\nfunction buildProvince (countryNodeElement, provinceNodeElement, selectedValue) {\n var selectedOption = getOption(countryNodeElement, selectedValue);\n var provinces = JSON.parse(selectedOption.getAttribute('data-provinces'));\n\n provinceNodeElement.options.length = 0;\n\n if (provinces.length) {\n buildOptions(provinceNodeElement, provinces)\n }\n\n return provinces;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHNob3BpZnkvdGhlbWUtYWRkcmVzc2VzL3RoZW1lLWFkZHJlc3Nlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHNob3BpZnkvdGhlbWUtYWRkcmVzc2VzL3RoZW1lLWFkZHJlc3Nlcy5qcz8xOWI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IgQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb3VudHJ5T3B0aW9ucyB0aGUgY291bnRyeSBvcHRpb25zIGluIGh0bWwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcihjb3VudHJ5T3B0aW9ucykge1xuICBpZiAodHlwZW9mIGNvdW50cnlPcHRpb25zICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoY291bnRyeU9wdGlvbnMgKyAnIGlzIG5vdCBhIHN0cmluZy4nKTtcbiAgfVxuICB0aGlzLmNvdW50cnlPcHRpb25zID0gY291bnRyeU9wdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb3VudHJ5IGFuZCBwcm92aW5jZSBzZWxlY3RvciB3aXRoIHRoZSBnaXZlbiBub2RlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Tm9kZX0gY291bnRyeU5vZGVFbGVtZW50IFRoZSA8c2VsZWN0PiBlbGVtZW50IGZvciBjb3VudHJ5XG4gKiBAcGFyYW0ge05vZGV9IHByb3ZpbmNlTm9kZUVsZW1lbnQgVGhlIDxzZWxlY3Q+IGVsZW1lbnQgZm9yIHByb3ZpbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBZGRpdGlvbmFsIHNldHRpbmdzIGF2YWlsYWJsZVxuICogQHBhcmFtIHtDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vbkNvdW50cnlDaGFuZ2V9IG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlIGNhbGxiYWNrIGFmdGVyIGEgY291bnRyeSBgY2hhbmdlYCBldmVudFxuICogQHBhcmFtIHtDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vblByb3ZpbmNlQ2hhbmdlfSBvcHRpb25zLm9uUHJvdmluY2VDaGFuZ2UgY2FsbGJhY2sgYWZ0ZXIgYSBwcm92aW5jZSBgY2hhbmdlYCBldmVudFxuICovXG5Db3VudHJ5UHJvdmluY2VTZWxlY3Rvci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY291bnRyeU5vZGVFbGVtZW50LCBwcm92aW5jZU5vZGVFbGVtZW50LCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgY291bnRyeU5vZGVFbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoY291bnRyeU5vZGVFbGVtZW50ICsgJyBpcyBub3QgYSBvYmplY3QuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByb3ZpbmNlTm9kZUVsZW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihwcm92aW5jZU5vZGVFbGVtZW50ICsgJyBpcyBub3QgYSBvYmplY3QuJyk7XG4gIH1cblxuICB2YXIgZGVmYXVsdFZhbHVlID0gY291bnRyeU5vZGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWZhdWx0Jyk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgY291bnRyeU5vZGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuY291bnRyeU9wdGlvbnM7XG4gIGNvdW50cnlOb2RlRWxlbWVudC52YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcblxuICBpZiAoZGVmYXVsdFZhbHVlICYmIGdldE9wdGlvbihjb3VudHJ5Tm9kZUVsZW1lbnQsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICB2YXIgcHJvdmluY2VzID0gYnVpbGRQcm92aW5jZShjb3VudHJ5Tm9kZUVsZW1lbnQsIHByb3ZpbmNlTm9kZUVsZW1lbnQsIGRlZmF1bHRWYWx1ZSk7XG4gICAgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UgJiYgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UocHJvdmluY2VzLCBwcm92aW5jZU5vZGVFbGVtZW50LCBjb3VudHJ5Tm9kZUVsZW1lbnQpO1xuICB9XG5cbiAgLy8gTGlzdGVuIGZvciB2YWx1ZSBjaGFuZ2Ugb24gdGhlIGNvdW50cnkgc2VsZWN0XG4gIGNvdW50cnlOb2RlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xuICAgIFxuICAgIHZhciBwcm92aW5jZXMgPSBidWlsZFByb3ZpbmNlKHRhcmdldCwgcHJvdmluY2VOb2RlRWxlbWVudCwgc2VsZWN0ZWRWYWx1ZSk7XG4gICAgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UgJiYgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UocHJvdmluY2VzLCBwcm92aW5jZU5vZGVFbGVtZW50LCBjb3VudHJ5Tm9kZUVsZW1lbnQpO1xuICB9KTtcblxuICBvcHRpb25zLm9uUHJvdmluY2VDaGFuZ2UgJiYgcHJvdmluY2VOb2RlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvcHRpb25zLm9uUHJvdmluY2VDaGFuZ2UpO1xufVxuXG4vKipcbiAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGFmdGVyIGEgdXNlciBpbnRlcmFjdGVkIHdpdGggYSBjb3VudHJ5IGA8c2VsZWN0PmBcbiAqIEBjYWxsYmFjayBDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vbkNvdW50cnlDaGFuZ2VcbiAqIEBwYXJhbSB7YXJyYXl9IHByb3ZpbmNlcyB0aGUgcGFyc2VkIHByb3ZpbmNlc1xuICogQHBhcmFtIHtOb2RlfSBwcm92aW5jZU5vZGVFbGVtZW50IHByb3ZpbmNlIGA8c2VsZWN0PmAgZWxlbWVudFxuICogQHBhcmFtIHtOb2RlfSBjb3VudHJ5Tm9kZUVsZW1lbnQgY291bnRyeSBgPHNlbGVjdD5gIGVsZW1lbnRcbiAqL1xuXG4gLyoqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciBhIHVzZXIgaW50ZXJhY3RlZCB3aXRoIGEgcHJvdmluY2UgYDxzZWxlY3Q+YFxuICogQGNhbGxiYWNrIENvdW50cnlQcm92aW5jZVNlbGVjdG9yfm9uUHJvdmluY2VDaGFuZ2VcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IHRoZSBwcm92aW5jZSBzZWxlY3RvciBgY2hhbmdlYCBldmVudCBvYmplY3RcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIDxvcHRpb24+IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZVxuICogZ2l2ZW4gbm9kZSBlbGVtZW50XG4gKiBBIG51bGwgaXMgcmV0dXJuZWQgaWYgbm8gc3VjaCA8b3B0aW9uPiBpcyBmb3VuZFxuICovXG5mdW5jdGlvbiBnZXRPcHRpb24obm9kZUVsZW1lbnQsIHZhbHVlKSB7XG4gIHJldHVybiBub2RlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdvcHRpb25bdmFsdWU9XCInICsgdmFsdWUgKydcIl0nKVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBmb3IgcHJvdmluY2Ugc2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gYnVpbGRPcHRpb25zIChwcm92aW5jZU5vZGVFbGVtZW50LCBwcm92aW5jZXMpIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3ZpbmNlTm9kZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRlZmF1bHQnKTtcblxuICBwcm92aW5jZXMuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgdmFyIG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uWzBdO1xuICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb25bMV07XG5cbiAgICBwcm92aW5jZU5vZGVFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xuICB9KVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgJiYgZ2V0T3B0aW9uKHByb3ZpbmNlTm9kZUVsZW1lbnQsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICBwcm92aW5jZU5vZGVFbGVtZW50LnZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBwcm92aW5jZSBzZWxlY3RvclxuICovXG5mdW5jdGlvbiBidWlsZFByb3ZpbmNlIChjb3VudHJ5Tm9kZUVsZW1lbnQsIHByb3ZpbmNlTm9kZUVsZW1lbnQsIHNlbGVjdGVkVmFsdWUpIHtcbiAgdmFyIHNlbGVjdGVkT3B0aW9uID0gZ2V0T3B0aW9uKGNvdW50cnlOb2RlRWxlbWVudCwgc2VsZWN0ZWRWYWx1ZSk7XG4gIHZhciBwcm92aW5jZXMgPSBKU09OLnBhcnNlKHNlbGVjdGVkT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm92aW5jZXMnKSk7XG5cbiAgcHJvdmluY2VOb2RlRWxlbWVudC5vcHRpb25zLmxlbmd0aCA9IDA7XG5cbiAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICBidWlsZE9wdGlvbnMocHJvdmluY2VOb2RlRWxlbWVudCwgcHJvdmluY2VzKVxuICB9XG5cbiAgcmV0dXJuIHByb3ZpbmNlcztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@shopify/theme-addresses/theme-addresses.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@vimeo/player/dist/player.es.js":
+/*!******************************************************!*\
+ !*** ./node_modules/@vimeo/player/dist/player.es.js ***!
+ \******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*! @vimeo/player v2.16.1 | (c) 2021 Vimeo | MIT License | https://github.com/vimeo/player.js */\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * @module lib/functions\n */\n\n/**\n * Check to see this is a node environment.\n * @type {Boolean}\n */\n\n/* global global */\nvar isNode = typeof __webpack_require__.g !== 'undefined' && {}.toString.call(__webpack_require__.g) === '[object global]';\n/**\n * Get the name of the method for a given getter or setter.\n *\n * @param {string} prop The name of the property.\n * @param {string} type Either “get” or “set”.\n * @return {string}\n */\n\nfunction getMethodName(prop, type) {\n if (prop.indexOf(type.toLowerCase()) === 0) {\n return prop;\n }\n\n return \"\".concat(type.toLowerCase()).concat(prop.substr(0, 1).toUpperCase()).concat(prop.substr(1));\n}\n/**\n * Check to see if the object is a DOM Element.\n *\n * @param {*} element The object to check.\n * @return {boolean}\n */\n\nfunction isDomElement(element) {\n return Boolean(element && element.nodeType === 1 && 'nodeName' in element && element.ownerDocument && element.ownerDocument.defaultView);\n}\n/**\n * Check to see whether the value is a number.\n *\n * @see http://dl.dropboxusercontent.com/u/35146/js/tests/isNumber.html\n * @param {*} value The value to check.\n * @param {boolean} integer Check if the value is an integer.\n * @return {boolean}\n */\n\nfunction isInteger(value) {\n // eslint-disable-next-line eqeqeq\n return !isNaN(parseFloat(value)) && isFinite(value) && Math.floor(value) == value;\n}\n/**\n * Check to see if the URL is a Vimeo url.\n *\n * @param {string} url The url string.\n * @return {boolean}\n */\n\nfunction isVimeoUrl(url) {\n return /^(https?:)?\\/\\/((player|www)\\.)?vimeo\\.com(?=$|\\/)/.test(url);\n}\n/**\n * Get the Vimeo URL from an element.\n * The element must have either a data-vimeo-id or data-vimeo-url attribute.\n *\n * @param {object} oEmbedParameters The oEmbed parameters.\n * @return {string}\n */\n\nfunction getVimeoUrl() {\n var oEmbedParameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var id = oEmbedParameters.id;\n var url = oEmbedParameters.url;\n var idOrUrl = id || url;\n\n if (!idOrUrl) {\n throw new Error('An id or url must be passed, either in an options object or as a data-vimeo-id or data-vimeo-url attribute.');\n }\n\n if (isInteger(idOrUrl)) {\n return \"https://vimeo.com/\".concat(idOrUrl);\n }\n\n if (isVimeoUrl(idOrUrl)) {\n return idOrUrl.replace('http:', 'https:');\n }\n\n if (id) {\n throw new TypeError(\"\\u201C\".concat(id, \"\\u201D is not a valid video id.\"));\n }\n\n throw new TypeError(\"\\u201C\".concat(idOrUrl, \"\\u201D is not a vimeo.com url.\"));\n}\n\nvar arrayIndexOfSupport = typeof Array.prototype.indexOf !== 'undefined';\nvar postMessageSupport = typeof window !== 'undefined' && typeof window.postMessage !== 'undefined';\n\nif (!isNode && (!arrayIndexOfSupport || !postMessageSupport)) {\n throw new Error('Sorry, the Vimeo Player API is not available in this browser.');\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\n/*!\n * weakmap-polyfill v2.0.1 - ECMAScript6 WeakMap polyfill\n * https://github.com/polygonplanet/weakmap-polyfill\n * Copyright (c) 2015-2020 Polygon Planet <polygon.planet.aqua@gmail.com>\n * @license MIT\n */\n(function (self) {\n\n if (self.WeakMap) {\n return;\n }\n\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n var defineProperty = function (object, name, value) {\n if (Object.defineProperty) {\n Object.defineProperty(object, name, {\n configurable: true,\n writable: true,\n value: value\n });\n } else {\n object[name] = value;\n }\n };\n\n self.WeakMap = function () {\n // ECMA-262 23.3 WeakMap Objects\n function WeakMap() {\n if (this === void 0) {\n throw new TypeError(\"Constructor WeakMap requires 'new'\");\n }\n\n defineProperty(this, '_id', genId('_WeakMap')); // ECMA-262 23.3.1.1 WeakMap([iterable])\n\n if (arguments.length > 0) {\n // Currently, WeakMap `iterable` argument is not supported\n throw new TypeError('WeakMap iterable is not supported');\n }\n } // ECMA-262 23.3.3.2 WeakMap.prototype.delete(key)\n\n\n defineProperty(WeakMap.prototype, 'delete', function (key) {\n checkInstance(this, 'delete');\n\n if (!isObject(key)) {\n return false;\n }\n\n var entry = key[this._id];\n\n if (entry && entry[0] === key) {\n delete key[this._id];\n return true;\n }\n\n return false;\n }); // ECMA-262 23.3.3.3 WeakMap.prototype.get(key)\n\n defineProperty(WeakMap.prototype, 'get', function (key) {\n checkInstance(this, 'get');\n\n if (!isObject(key)) {\n return void 0;\n }\n\n var entry = key[this._id];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n\n return void 0;\n }); // ECMA-262 23.3.3.4 WeakMap.prototype.has(key)\n\n defineProperty(WeakMap.prototype, 'has', function (key) {\n checkInstance(this, 'has');\n\n if (!isObject(key)) {\n return false;\n }\n\n var entry = key[this._id];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }); // ECMA-262 23.3.3.5 WeakMap.prototype.set(key, value)\n\n defineProperty(WeakMap.prototype, 'set', function (key, value) {\n checkInstance(this, 'set');\n\n if (!isObject(key)) {\n throw new TypeError('Invalid value used as weak map key');\n }\n\n var entry = key[this._id];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n return this;\n }\n\n defineProperty(key, this._id, [key, value]);\n return this;\n });\n\n function checkInstance(x, methodName) {\n if (!isObject(x) || !hasOwnProperty.call(x, '_id')) {\n throw new TypeError(methodName + ' method called on incompatible receiver ' + typeof x);\n }\n }\n\n function genId(prefix) {\n return prefix + '_' + rand() + '.' + rand();\n }\n\n function rand() {\n return Math.random().toString().substring(2);\n }\n\n defineProperty(WeakMap, '_polyfill', true);\n return WeakMap;\n }();\n\n function isObject(x) {\n return Object(x) === x;\n }\n})(typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : commonjsGlobal);\n\nvar npo_src = createCommonjsModule(function (module) {\n/*! Native Promise Only\n v0.8.1 (c) Kyle Simpson\n MIT License: http://getify.mit-license.org\n*/\n(function UMD(name, context, definition) {\n // special form of UMD for polyfilling across evironments\n context[name] = context[name] || definition();\n\n if ( module.exports) {\n module.exports = context[name];\n }\n})(\"Promise\", typeof commonjsGlobal != \"undefined\" ? commonjsGlobal : commonjsGlobal, function DEF() {\n\n var builtInProp,\n cycle,\n scheduling_queue,\n ToString = Object.prototype.toString,\n timer = typeof setImmediate != \"undefined\" ? function timer(fn) {\n return setImmediate(fn);\n } : setTimeout; // dammit, IE8.\n\n try {\n Object.defineProperty({}, \"x\", {});\n\n builtInProp = function builtInProp(obj, name, val, config) {\n return Object.defineProperty(obj, name, {\n value: val,\n writable: true,\n configurable: config !== false\n });\n };\n } catch (err) {\n builtInProp = function builtInProp(obj, name, val) {\n obj[name] = val;\n return obj;\n };\n } // Note: using a queue instead of array for efficiency\n\n\n scheduling_queue = function Queue() {\n var first, last, item;\n\n function Item(fn, self) {\n this.fn = fn;\n this.self = self;\n this.next = void 0;\n }\n\n return {\n add: function add(fn, self) {\n item = new Item(fn, self);\n\n if (last) {\n last.next = item;\n } else {\n first = item;\n }\n\n last = item;\n item = void 0;\n },\n drain: function drain() {\n var f = first;\n first = last = cycle = void 0;\n\n while (f) {\n f.fn.call(f.self);\n f = f.next;\n }\n }\n };\n }();\n\n function schedule(fn, self) {\n scheduling_queue.add(fn, self);\n\n if (!cycle) {\n cycle = timer(scheduling_queue.drain);\n }\n } // promise duck typing\n\n\n function isThenable(o) {\n var _then,\n o_type = typeof o;\n\n if (o != null && (o_type == \"object\" || o_type == \"function\")) {\n _then = o.then;\n }\n\n return typeof _then == \"function\" ? _then : false;\n }\n\n function notify() {\n for (var i = 0; i < this.chain.length; i++) {\n notifyIsolated(this, this.state === 1 ? this.chain[i].success : this.chain[i].failure, this.chain[i]);\n }\n\n this.chain.length = 0;\n } // NOTE: This is a separate function to isolate\n // the `try..catch` so that other code can be\n // optimized better\n\n\n function notifyIsolated(self, cb, chain) {\n var ret, _then;\n\n try {\n if (cb === false) {\n chain.reject(self.msg);\n } else {\n if (cb === true) {\n ret = self.msg;\n } else {\n ret = cb.call(void 0, self.msg);\n }\n\n if (ret === chain.promise) {\n chain.reject(TypeError(\"Promise-chain cycle\"));\n } else if (_then = isThenable(ret)) {\n _then.call(ret, chain.resolve, chain.reject);\n } else {\n chain.resolve(ret);\n }\n }\n } catch (err) {\n chain.reject(err);\n }\n }\n\n function resolve(msg) {\n var _then,\n self = this; // already triggered?\n\n\n if (self.triggered) {\n return;\n }\n\n self.triggered = true; // unwrap\n\n if (self.def) {\n self = self.def;\n }\n\n try {\n if (_then = isThenable(msg)) {\n schedule(function () {\n var def_wrapper = new MakeDefWrapper(self);\n\n try {\n _then.call(msg, function $resolve$() {\n resolve.apply(def_wrapper, arguments);\n }, function $reject$() {\n reject.apply(def_wrapper, arguments);\n });\n } catch (err) {\n reject.call(def_wrapper, err);\n }\n });\n } else {\n self.msg = msg;\n self.state = 1;\n\n if (self.chain.length > 0) {\n schedule(notify, self);\n }\n }\n } catch (err) {\n reject.call(new MakeDefWrapper(self), err);\n }\n }\n\n function reject(msg) {\n var self = this; // already triggered?\n\n if (self.triggered) {\n return;\n }\n\n self.triggered = true; // unwrap\n\n if (self.def) {\n self = self.def;\n }\n\n self.msg = msg;\n self.state = 2;\n\n if (self.chain.length > 0) {\n schedule(notify, self);\n }\n }\n\n function iteratePromises(Constructor, arr, resolver, rejecter) {\n for (var idx = 0; idx < arr.length; idx++) {\n (function IIFE(idx) {\n Constructor.resolve(arr[idx]).then(function $resolver$(msg) {\n resolver(idx, msg);\n }, rejecter);\n })(idx);\n }\n }\n\n function MakeDefWrapper(self) {\n this.def = self;\n this.triggered = false;\n }\n\n function MakeDef(self) {\n this.promise = self;\n this.state = 0;\n this.triggered = false;\n this.chain = [];\n this.msg = void 0;\n }\n\n function Promise(executor) {\n if (typeof executor != \"function\") {\n throw TypeError(\"Not a function\");\n }\n\n if (this.__NPO__ !== 0) {\n throw TypeError(\"Not a promise\");\n } // instance shadowing the inherited \"brand\"\n // to signal an already \"initialized\" promise\n\n\n this.__NPO__ = 1;\n var def = new MakeDef(this);\n\n this[\"then\"] = function then(success, failure) {\n var o = {\n success: typeof success == \"function\" ? success : true,\n failure: typeof failure == \"function\" ? failure : false\n }; // Note: `then(..)` itself can be borrowed to be used against\n // a different promise constructor for making the chained promise,\n // by substituting a different `this` binding.\n\n o.promise = new this.constructor(function extractChain(resolve, reject) {\n if (typeof resolve != \"function\" || typeof reject != \"function\") {\n throw TypeError(\"Not a function\");\n }\n\n o.resolve = resolve;\n o.reject = reject;\n });\n def.chain.push(o);\n\n if (def.state !== 0) {\n schedule(notify, def);\n }\n\n return o.promise;\n };\n\n this[\"catch\"] = function $catch$(failure) {\n return this.then(void 0, failure);\n };\n\n try {\n executor.call(void 0, function publicResolve(msg) {\n resolve.call(def, msg);\n }, function publicReject(msg) {\n reject.call(def, msg);\n });\n } catch (err) {\n reject.call(def, err);\n }\n }\n\n var PromisePrototype = builtInProp({}, \"constructor\", Promise,\n /*configurable=*/\n false); // Note: Android 4 cannot use `Object.defineProperty(..)` here\n\n Promise.prototype = PromisePrototype; // built-in \"brand\" to signal an \"uninitialized\" promise\n\n builtInProp(PromisePrototype, \"__NPO__\", 0,\n /*configurable=*/\n false);\n builtInProp(Promise, \"resolve\", function Promise$resolve(msg) {\n var Constructor = this; // spec mandated checks\n // note: best \"isPromise\" check that's practical for now\n\n if (msg && typeof msg == \"object\" && msg.__NPO__ === 1) {\n return msg;\n }\n\n return new Constructor(function executor(resolve, reject) {\n if (typeof resolve != \"function\" || typeof reject != \"function\") {\n throw TypeError(\"Not a function\");\n }\n\n resolve(msg);\n });\n });\n builtInProp(Promise, \"reject\", function Promise$reject(msg) {\n return new this(function executor(resolve, reject) {\n if (typeof resolve != \"function\" || typeof reject != \"function\") {\n throw TypeError(\"Not a function\");\n }\n\n reject(msg);\n });\n });\n builtInProp(Promise, \"all\", function Promise$all(arr) {\n var Constructor = this; // spec mandated checks\n\n if (ToString.call(arr) != \"[object Array]\") {\n return Constructor.reject(TypeError(\"Not an array\"));\n }\n\n if (arr.length === 0) {\n return Constructor.resolve([]);\n }\n\n return new Constructor(function executor(resolve, reject) {\n if (typeof resolve != \"function\" || typeof reject != \"function\") {\n throw TypeError(\"Not a function\");\n }\n\n var len = arr.length,\n msgs = Array(len),\n count = 0;\n iteratePromises(Constructor, arr, function resolver(idx, msg) {\n msgs[idx] = msg;\n\n if (++count === len) {\n resolve(msgs);\n }\n }, reject);\n });\n });\n builtInProp(Promise, \"race\", function Promise$race(arr) {\n var Constructor = this; // spec mandated checks\n\n if (ToString.call(arr) != \"[object Array]\") {\n return Constructor.reject(TypeError(\"Not an array\"));\n }\n\n return new Constructor(function executor(resolve, reject) {\n if (typeof resolve != \"function\" || typeof reject != \"function\") {\n throw TypeError(\"Not a function\");\n }\n\n iteratePromises(Constructor, arr, function resolver(idx, msg) {\n resolve(msg);\n }, reject);\n });\n });\n return Promise;\n});\n});\n\n/**\n * @module lib/callbacks\n */\nvar callbackMap = new WeakMap();\n/**\n * Store a callback for a method or event for a player.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name.\n * @param {(function(this:Player, *): void|{resolve: function, reject: function})} callback\n * The callback to call or an object with resolve and reject functions for a promise.\n * @return {void}\n */\n\nfunction storeCallback(player, name, callback) {\n var playerCallbacks = callbackMap.get(player.element) || {};\n\n if (!(name in playerCallbacks)) {\n playerCallbacks[name] = [];\n }\n\n playerCallbacks[name].push(callback);\n callbackMap.set(player.element, playerCallbacks);\n}\n/**\n * Get the callbacks for a player and event or method.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name\n * @return {function[]}\n */\n\nfunction getCallbacks(player, name) {\n var playerCallbacks = callbackMap.get(player.element) || {};\n return playerCallbacks[name] || [];\n}\n/**\n * Remove a stored callback for a method or event for a player.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name\n * @param {function} [callback] The specific callback to remove.\n * @return {boolean} Was this the last callback?\n */\n\nfunction removeCallback(player, name, callback) {\n var playerCallbacks = callbackMap.get(player.element) || {};\n\n if (!playerCallbacks[name]) {\n return true;\n } // If no callback is passed, remove all callbacks for the event\n\n\n if (!callback) {\n playerCallbacks[name] = [];\n callbackMap.set(player.element, playerCallbacks);\n return true;\n }\n\n var index = playerCallbacks[name].indexOf(callback);\n\n if (index !== -1) {\n playerCallbacks[name].splice(index, 1);\n }\n\n callbackMap.set(player.element, playerCallbacks);\n return playerCallbacks[name] && playerCallbacks[name].length === 0;\n}\n/**\n * Return the first stored callback for a player and event or method.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name.\n * @return {function} The callback, or false if there were none\n */\n\nfunction shiftCallbacks(player, name) {\n var playerCallbacks = getCallbacks(player, name);\n\n if (playerCallbacks.length < 1) {\n return false;\n }\n\n var callback = playerCallbacks.shift();\n removeCallback(player, name, callback);\n return callback;\n}\n/**\n * Move callbacks associated with an element to another element.\n *\n * @param {HTMLElement} oldElement The old element.\n * @param {HTMLElement} newElement The new element.\n * @return {void}\n */\n\nfunction swapCallbacks(oldElement, newElement) {\n var playerCallbacks = callbackMap.get(oldElement);\n callbackMap.set(newElement, playerCallbacks);\n callbackMap.delete(oldElement);\n}\n\n/**\n * @module lib/embed\n */\nvar oEmbedParameters = ['autopause', 'autoplay', 'background', 'byline', 'color', 'controls', 'dnt', 'height', 'id', 'keyboard', 'loop', 'maxheight', 'maxwidth', 'muted', 'playsinline', 'portrait', 'responsive', 'speed', 'texttrack', 'title', 'transparent', 'url', 'width'];\n/**\n * Get the 'data-vimeo'-prefixed attributes from an element as an object.\n *\n * @param {HTMLElement} element The element.\n * @param {Object} [defaults={}] The default values to use.\n * @return {Object<string, string>}\n */\n\nfunction getOEmbedParameters(element) {\n var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return oEmbedParameters.reduce(function (params, param) {\n var value = element.getAttribute(\"data-vimeo-\".concat(param));\n\n if (value || value === '') {\n params[param] = value === '' ? 1 : value;\n }\n\n return params;\n }, defaults);\n}\n/**\n * Create an embed from oEmbed data inside an element.\n *\n * @param {object} data The oEmbed data.\n * @param {HTMLElement} element The element to put the iframe in.\n * @return {HTMLIFrameElement} The iframe embed.\n */\n\nfunction createEmbed(_ref, element) {\n var html = _ref.html;\n\n if (!element) {\n throw new TypeError('An element must be provided');\n }\n\n if (element.getAttribute('data-vimeo-initialized') !== null) {\n return element.querySelector('iframe');\n }\n\n var div = document.createElement('div');\n div.innerHTML = html;\n element.appendChild(div.firstChild);\n element.setAttribute('data-vimeo-initialized', 'true');\n return element.querySelector('iframe');\n}\n/**\n * Make an oEmbed call for the specified URL.\n *\n * @param {string} videoUrl The vimeo.com url for the video.\n * @param {Object} [params] Parameters to pass to oEmbed.\n * @param {HTMLElement} element The element.\n * @return {Promise}\n */\n\nfunction getOEmbedData(videoUrl) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var element = arguments.length > 2 ? arguments[2] : undefined;\n return new Promise(function (resolve, reject) {\n if (!isVimeoUrl(videoUrl)) {\n throw new TypeError(\"\\u201C\".concat(videoUrl, \"\\u201D is not a vimeo.com url.\"));\n }\n\n var url = \"https://vimeo.com/api/oembed.json?url=\".concat(encodeURIComponent(videoUrl));\n\n for (var param in params) {\n if (params.hasOwnProperty(param)) {\n url += \"&\".concat(param, \"=\").concat(encodeURIComponent(params[param]));\n }\n }\n\n var xhr = 'XDomainRequest' in window ? new XDomainRequest() : new XMLHttpRequest();\n xhr.open('GET', url, true);\n\n xhr.onload = function () {\n if (xhr.status === 404) {\n reject(new Error(\"\\u201C\".concat(videoUrl, \"\\u201D was not found.\")));\n return;\n }\n\n if (xhr.status === 403) {\n reject(new Error(\"\\u201C\".concat(videoUrl, \"\\u201D is not embeddable.\")));\n return;\n }\n\n try {\n var json = JSON.parse(xhr.responseText); // Check api response for 403 on oembed\n\n if (json.domain_status_code === 403) {\n // We still want to create the embed to give users visual feedback\n createEmbed(json, element);\n reject(new Error(\"\\u201C\".concat(videoUrl, \"\\u201D is not embeddable.\")));\n return;\n }\n\n resolve(json);\n } catch (error) {\n reject(error);\n }\n };\n\n xhr.onerror = function () {\n var status = xhr.status ? \" (\".concat(xhr.status, \")\") : '';\n reject(new Error(\"There was an error fetching the embed code from Vimeo\".concat(status, \".\")));\n };\n\n xhr.send();\n });\n}\n/**\n * Initialize all embeds within a specific element\n *\n * @param {HTMLElement} [parent=document] The parent element.\n * @return {void}\n */\n\nfunction initializeEmbeds() {\n var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n var elements = [].slice.call(parent.querySelectorAll('[data-vimeo-id], [data-vimeo-url]'));\n\n var handleError = function handleError(error) {\n if ('console' in window && console.error) {\n console.error(\"There was an error creating an embed: \".concat(error));\n }\n };\n\n elements.forEach(function (element) {\n try {\n // Skip any that have data-vimeo-defer\n if (element.getAttribute('data-vimeo-defer') !== null) {\n return;\n }\n\n var params = getOEmbedParameters(element);\n var url = getVimeoUrl(params);\n getOEmbedData(url, params, element).then(function (data) {\n return createEmbed(data, element);\n }).catch(handleError);\n } catch (error) {\n handleError(error);\n }\n });\n}\n/**\n * Resize embeds when messaged by the player.\n *\n * @param {HTMLElement} [parent=document] The parent element.\n * @return {void}\n */\n\nfunction resizeEmbeds() {\n var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n\n // Prevent execution if users include the player.js script multiple times.\n if (window.VimeoPlayerResizeEmbeds_) {\n return;\n }\n\n window.VimeoPlayerResizeEmbeds_ = true;\n\n var onMessage = function onMessage(event) {\n if (!isVimeoUrl(event.origin)) {\n return;\n } // 'spacechange' is fired only on embeds with cards\n\n\n if (!event.data || event.data.event !== 'spacechange') {\n return;\n }\n\n var iframes = parent.querySelectorAll('iframe');\n\n for (var i = 0; i < iframes.length; i++) {\n if (iframes[i].contentWindow !== event.source) {\n continue;\n } // Change padding-bottom of the enclosing div to accommodate\n // card carousel without distorting aspect ratio\n\n\n var space = iframes[i].parentElement;\n space.style.paddingBottom = \"\".concat(event.data.data[0].bottom, \"px\");\n break;\n }\n };\n\n window.addEventListener('message', onMessage);\n}\n\n/**\n * @module lib/postmessage\n */\n/**\n * Parse a message received from postMessage.\n *\n * @param {*} data The data received from postMessage.\n * @return {object}\n */\n\nfunction parseMessageData(data) {\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (error) {\n // If the message cannot be parsed, throw the error as a warning\n console.warn(error);\n return {};\n }\n }\n\n return data;\n}\n/**\n * Post a message to the specified target.\n *\n * @param {Player} player The player object to use.\n * @param {string} method The API method to call.\n * @param {object} params The parameters to send to the player.\n * @return {void}\n */\n\nfunction postMessage(player, method, params) {\n if (!player.element.contentWindow || !player.element.contentWindow.postMessage) {\n return;\n }\n\n var message = {\n method: method\n };\n\n if (params !== undefined) {\n message.value = params;\n } // IE 8 and 9 do not support passing messages, so stringify them\n\n\n var ieVersion = parseFloat(navigator.userAgent.toLowerCase().replace(/^.*msie (\\d+).*$/, '$1'));\n\n if (ieVersion >= 8 && ieVersion < 10) {\n message = JSON.stringify(message);\n }\n\n player.element.contentWindow.postMessage(message, player.origin);\n}\n/**\n * Parse the data received from a message event.\n *\n * @param {Player} player The player that received the message.\n * @param {(Object|string)} data The message data. Strings will be parsed into JSON.\n * @return {void}\n */\n\nfunction processData(player, data) {\n data = parseMessageData(data);\n var callbacks = [];\n var param;\n\n if (data.event) {\n if (data.event === 'error') {\n var promises = getCallbacks(player, data.data.method);\n promises.forEach(function (promise) {\n var error = new Error(data.data.message);\n error.name = data.data.name;\n promise.reject(error);\n removeCallback(player, data.data.method, promise);\n });\n }\n\n callbacks = getCallbacks(player, \"event:\".concat(data.event));\n param = data.data;\n } else if (data.method) {\n var callback = shiftCallbacks(player, data.method);\n\n if (callback) {\n callbacks.push(callback);\n param = data.value;\n }\n }\n\n callbacks.forEach(function (callback) {\n try {\n if (typeof callback === 'function') {\n callback.call(player, param);\n return;\n }\n\n callback.resolve(param);\n } catch (e) {// empty\n }\n });\n}\n\n/* MIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nTerms */\nfunction initializeScreenfull() {\n var fn = function () {\n var val;\n var fnMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'], // New WebKit\n ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'], // Old WebKit\n ['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];\n var i = 0;\n var l = fnMap.length;\n var ret = {};\n\n for (; i < l; i++) {\n val = fnMap[i];\n\n if (val && val[1] in document) {\n for (i = 0; i < val.length; i++) {\n ret[fnMap[0][i]] = val[i];\n }\n\n return ret;\n }\n }\n\n return false;\n }();\n\n var eventNameMap = {\n fullscreenchange: fn.fullscreenchange,\n fullscreenerror: fn.fullscreenerror\n };\n var screenfull = {\n request: function request(element) {\n return new Promise(function (resolve, reject) {\n var onFullScreenEntered = function onFullScreenEntered() {\n screenfull.off('fullscreenchange', onFullScreenEntered);\n resolve();\n };\n\n screenfull.on('fullscreenchange', onFullScreenEntered);\n element = element || document.documentElement;\n var returnPromise = element[fn.requestFullscreen]();\n\n if (returnPromise instanceof Promise) {\n returnPromise.then(onFullScreenEntered).catch(reject);\n }\n });\n },\n exit: function exit() {\n return new Promise(function (resolve, reject) {\n if (!screenfull.isFullscreen) {\n resolve();\n return;\n }\n\n var onFullScreenExit = function onFullScreenExit() {\n screenfull.off('fullscreenchange', onFullScreenExit);\n resolve();\n };\n\n screenfull.on('fullscreenchange', onFullScreenExit);\n var returnPromise = document[fn.exitFullscreen]();\n\n if (returnPromise instanceof Promise) {\n returnPromise.then(onFullScreenExit).catch(reject);\n }\n });\n },\n on: function on(event, callback) {\n var eventName = eventNameMap[event];\n\n if (eventName) {\n document.addEventListener(eventName, callback);\n }\n },\n off: function off(event, callback) {\n var eventName = eventNameMap[event];\n\n if (eventName) {\n document.removeEventListener(eventName, callback);\n }\n }\n };\n Object.defineProperties(screenfull, {\n isFullscreen: {\n get: function get() {\n return Boolean(document[fn.fullscreenElement]);\n }\n },\n element: {\n enumerable: true,\n get: function get() {\n return document[fn.fullscreenElement];\n }\n },\n isEnabled: {\n enumerable: true,\n get: function get() {\n // Coerce to boolean in case of old WebKit\n return Boolean(document[fn.fullscreenEnabled]);\n }\n }\n });\n return screenfull;\n}\n\nvar playerMap = new WeakMap();\nvar readyMap = new WeakMap();\nvar screenfull = {};\n\nvar Player = /*#__PURE__*/function () {\n /**\n * Create a Player.\n *\n * @param {(HTMLIFrameElement|HTMLElement|string|jQuery)} element A reference to the Vimeo\n * player iframe, and id, or a jQuery object.\n * @param {object} [options] oEmbed parameters to use when creating an embed in the element.\n * @return {Player}\n */\n function Player(element) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Player);\n\n /* global jQuery */\n if (window.jQuery && element instanceof jQuery) {\n if (element.length > 1 && window.console && console.warn) {\n console.warn('A jQuery object with multiple elements was passed, using the first element.');\n }\n\n element = element[0];\n } // Find an element by ID\n\n\n if (typeof document !== 'undefined' && typeof element === 'string') {\n element = document.getElementById(element);\n } // Not an element!\n\n\n if (!isDomElement(element)) {\n throw new TypeError('You must pass either a valid element or a valid id.');\n } // Already initialized an embed in this div, so grab the iframe\n\n\n if (element.nodeName !== 'IFRAME') {\n var iframe = element.querySelector('iframe');\n\n if (iframe) {\n element = iframe;\n }\n } // iframe url is not a Vimeo url\n\n\n if (element.nodeName === 'IFRAME' && !isVimeoUrl(element.getAttribute('src') || '')) {\n throw new Error('The player element passed isn’t a Vimeo embed.');\n } // If there is already a player object in the map, return that\n\n\n if (playerMap.has(element)) {\n return playerMap.get(element);\n }\n\n this._window = element.ownerDocument.defaultView;\n this.element = element;\n this.origin = '*';\n var readyPromise = new npo_src(function (resolve, reject) {\n _this._onMessage = function (event) {\n if (!isVimeoUrl(event.origin) || _this.element.contentWindow !== event.source) {\n return;\n }\n\n if (_this.origin === '*') {\n _this.origin = event.origin;\n }\n\n var data = parseMessageData(event.data);\n var isError = data && data.event === 'error';\n var isReadyError = isError && data.data && data.data.method === 'ready';\n\n if (isReadyError) {\n var error = new Error(data.data.message);\n error.name = data.data.name;\n reject(error);\n return;\n }\n\n var isReadyEvent = data && data.event === 'ready';\n var isPingResponse = data && data.method === 'ping';\n\n if (isReadyEvent || isPingResponse) {\n _this.element.setAttribute('data-ready', 'true');\n\n resolve();\n return;\n }\n\n processData(_this, data);\n };\n\n _this._window.addEventListener('message', _this._onMessage);\n\n if (_this.element.nodeName !== 'IFRAME') {\n var params = getOEmbedParameters(element, options);\n var url = getVimeoUrl(params);\n getOEmbedData(url, params, element).then(function (data) {\n var iframe = createEmbed(data, element); // Overwrite element with the new iframe,\n // but store reference to the original element\n\n _this.element = iframe;\n _this._originalElement = element;\n swapCallbacks(element, iframe);\n playerMap.set(_this.element, _this);\n return data;\n }).catch(reject);\n }\n }); // Store a copy of this Player in the map\n\n readyMap.set(this, readyPromise);\n playerMap.set(this.element, this); // Send a ping to the iframe so the ready promise will be resolved if\n // the player is already ready.\n\n if (this.element.nodeName === 'IFRAME') {\n postMessage(this, 'ping');\n }\n\n if (screenfull.isEnabled) {\n var exitFullscreen = function exitFullscreen() {\n return screenfull.exit();\n };\n\n this.fullscreenchangeHandler = function () {\n if (screenfull.isFullscreen) {\n storeCallback(_this, 'event:exitFullscreen', exitFullscreen);\n } else {\n removeCallback(_this, 'event:exitFullscreen', exitFullscreen);\n } // eslint-disable-next-line\n\n\n _this.ready().then(function () {\n postMessage(_this, 'fullscreenchange', screenfull.isFullscreen);\n });\n };\n\n screenfull.on('fullscreenchange', this.fullscreenchangeHandler);\n }\n\n return this;\n }\n /**\n * Get a promise for a method.\n *\n * @param {string} name The API method to call.\n * @param {Object} [args={}] Arguments to send via postMessage.\n * @return {Promise}\n */\n\n\n _createClass(Player, [{\n key: \"callMethod\",\n value: function callMethod(name) {\n var _this2 = this;\n\n var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return new npo_src(function (resolve, reject) {\n // We are storing the resolve/reject handlers to call later, so we\n // can’t return here.\n // eslint-disable-next-line promise/always-return\n return _this2.ready().then(function () {\n storeCallback(_this2, name, {\n resolve: resolve,\n reject: reject\n });\n postMessage(_this2, name, args);\n }).catch(reject);\n });\n }\n /**\n * Get a promise for the value of a player property.\n *\n * @param {string} name The property name\n * @return {Promise}\n */\n\n }, {\n key: \"get\",\n value: function get(name) {\n var _this3 = this;\n\n return new npo_src(function (resolve, reject) {\n name = getMethodName(name, 'get'); // We are storing the resolve/reject handlers to call later, so we\n // can’t return here.\n // eslint-disable-next-line promise/always-return\n\n return _this3.ready().then(function () {\n storeCallback(_this3, name, {\n resolve: resolve,\n reject: reject\n });\n postMessage(_this3, name);\n }).catch(reject);\n });\n }\n /**\n * Get a promise for setting the value of a player property.\n *\n * @param {string} name The API method to call.\n * @param {mixed} value The value to set.\n * @return {Promise}\n */\n\n }, {\n key: \"set\",\n value: function set(name, value) {\n var _this4 = this;\n\n return new npo_src(function (resolve, reject) {\n name = getMethodName(name, 'set');\n\n if (value === undefined || value === null) {\n throw new TypeError('There must be a value to set.');\n } // We are storing the resolve/reject handlers to call later, so we\n // can’t return here.\n // eslint-disable-next-line promise/always-return\n\n\n return _this4.ready().then(function () {\n storeCallback(_this4, name, {\n resolve: resolve,\n reject: reject\n });\n postMessage(_this4, name, value);\n }).catch(reject);\n });\n }\n /**\n * Add an event listener for the specified event. Will call the\n * callback with a single parameter, `data`, that contains the data for\n * that event.\n *\n * @param {string} eventName The name of the event.\n * @param {function(*)} callback The function to call when the event fires.\n * @return {void}\n */\n\n }, {\n key: \"on\",\n value: function on(eventName, callback) {\n if (!eventName) {\n throw new TypeError('You must pass an event name.');\n }\n\n if (!callback) {\n throw new TypeError('You must pass a callback function.');\n }\n\n if (typeof callback !== 'function') {\n throw new TypeError('The callback must be a function.');\n }\n\n var callbacks = getCallbacks(this, \"event:\".concat(eventName));\n\n if (callbacks.length === 0) {\n this.callMethod('addEventListener', eventName).catch(function () {// Ignore the error. There will be an error event fired that\n // will trigger the error callback if they are listening.\n });\n }\n\n storeCallback(this, \"event:\".concat(eventName), callback);\n }\n /**\n * Remove an event listener for the specified event. Will remove all\n * listeners for that event if a `callback` isn’t passed, or only that\n * specific callback if it is passed.\n *\n * @param {string} eventName The name of the event.\n * @param {function} [callback] The specific callback to remove.\n * @return {void}\n */\n\n }, {\n key: \"off\",\n value: function off(eventName, callback) {\n if (!eventName) {\n throw new TypeError('You must pass an event name.');\n }\n\n if (callback && typeof callback !== 'function') {\n throw new TypeError('The callback must be a function.');\n }\n\n var lastCallback = removeCallback(this, \"event:\".concat(eventName), callback); // If there are no callbacks left, remove the listener\n\n if (lastCallback) {\n this.callMethod('removeEventListener', eventName).catch(function (e) {// Ignore the error. There will be an error event fired that\n // will trigger the error callback if they are listening.\n });\n }\n }\n /**\n * A promise to load a new video.\n *\n * @promise LoadVideoPromise\n * @fulfill {number} The video with this id successfully loaded.\n * @reject {TypeError} The id was not a number.\n */\n\n /**\n * Load a new video into this embed. The promise will be resolved if\n * the video is successfully loaded, or it will be rejected if it could\n * not be loaded.\n *\n * @param {number|object} options The id of the video or an object with embed options.\n * @return {LoadVideoPromise}\n */\n\n }, {\n key: \"loadVideo\",\n value: function loadVideo(options) {\n return this.callMethod('loadVideo', options);\n }\n /**\n * A promise to perform an action when the Player is ready.\n *\n * @todo document errors\n * @promise LoadVideoPromise\n * @fulfill {void}\n */\n\n /**\n * Trigger a function when the player iframe has initialized. You do not\n * need to wait for `ready` to trigger to begin adding event listeners\n * or calling other methods.\n *\n * @return {ReadyPromise}\n */\n\n }, {\n key: \"ready\",\n value: function ready() {\n var readyPromise = readyMap.get(this) || new npo_src(function (resolve, reject) {\n reject(new Error('Unknown player. Probably unloaded.'));\n });\n return npo_src.resolve(readyPromise);\n }\n /**\n * A promise to add a cue point to the player.\n *\n * @promise AddCuePointPromise\n * @fulfill {string} The id of the cue point to use for removeCuePoint.\n * @reject {RangeError} the time was less than 0 or greater than the\n * video’s duration.\n * @reject {UnsupportedError} Cue points are not supported with the current\n * player or browser.\n */\n\n /**\n * Add a cue point to the player.\n *\n * @param {number} time The time for the cue point.\n * @param {object} [data] Arbitrary data to be returned with the cue point.\n * @return {AddCuePointPromise}\n */\n\n }, {\n key: \"addCuePoint\",\n value: function addCuePoint(time) {\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.callMethod('addCuePoint', {\n time: time,\n data: data\n });\n }\n /**\n * A promise to remove a cue point from the player.\n *\n * @promise AddCuePointPromise\n * @fulfill {string} The id of the cue point that was removed.\n * @reject {InvalidCuePoint} The cue point with the specified id was not\n * found.\n * @reject {UnsupportedError} Cue points are not supported with the current\n * player or browser.\n */\n\n /**\n * Remove a cue point from the video.\n *\n * @param {string} id The id of the cue point to remove.\n * @return {RemoveCuePointPromise}\n */\n\n }, {\n key: \"removeCuePoint\",\n value: function removeCuePoint(id) {\n return this.callMethod('removeCuePoint', id);\n }\n /**\n * A representation of a text track on a video.\n *\n * @typedef {Object} VimeoTextTrack\n * @property {string} language The ISO language code.\n * @property {string} kind The kind of track it is (captions or subtitles).\n * @property {string} label The human‐readable label for the track.\n */\n\n /**\n * A promise to enable a text track.\n *\n * @promise EnableTextTrackPromise\n * @fulfill {VimeoTextTrack} The text track that was enabled.\n * @reject {InvalidTrackLanguageError} No track was available with the\n * specified language.\n * @reject {InvalidTrackError} No track was available with the specified\n * language and kind.\n */\n\n /**\n * Enable the text track with the specified language, and optionally the\n * specified kind (captions or subtitles).\n *\n * When set via the API, the track language will not change the viewer’s\n * stored preference.\n *\n * @param {string} language The two‐letter language code.\n * @param {string} [kind] The kind of track to enable (captions or subtitles).\n * @return {EnableTextTrackPromise}\n */\n\n }, {\n key: \"enableTextTrack\",\n value: function enableTextTrack(language, kind) {\n if (!language) {\n throw new TypeError('You must pass a language.');\n }\n\n return this.callMethod('enableTextTrack', {\n language: language,\n kind: kind\n });\n }\n /**\n * A promise to disable the active text track.\n *\n * @promise DisableTextTrackPromise\n * @fulfill {void} The track was disabled.\n */\n\n /**\n * Disable the currently-active text track.\n *\n * @return {DisableTextTrackPromise}\n */\n\n }, {\n key: \"disableTextTrack\",\n value: function disableTextTrack() {\n return this.callMethod('disableTextTrack');\n }\n /**\n * A promise to pause the video.\n *\n * @promise PausePromise\n * @fulfill {void} The video was paused.\n */\n\n /**\n * Pause the video if it’s playing.\n *\n * @return {PausePromise}\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n return this.callMethod('pause');\n }\n /**\n * A promise to play the video.\n *\n * @promise PlayPromise\n * @fulfill {void} The video was played.\n */\n\n /**\n * Play the video if it’s paused. **Note:** on iOS and some other\n * mobile devices, you cannot programmatically trigger play. Once the\n * viewer has tapped on the play button in the player, however, you\n * will be able to use this function.\n *\n * @return {PlayPromise}\n */\n\n }, {\n key: \"play\",\n value: function play() {\n return this.callMethod('play');\n }\n /**\n * Request that the player enters fullscreen.\n * @return {Promise}\n */\n\n }, {\n key: \"requestFullscreen\",\n value: function requestFullscreen() {\n if (screenfull.isEnabled) {\n return screenfull.request(this.element);\n }\n\n return this.callMethod('requestFullscreen');\n }\n /**\n * Request that the player exits fullscreen.\n * @return {Promise}\n */\n\n }, {\n key: \"exitFullscreen\",\n value: function exitFullscreen() {\n if (screenfull.isEnabled) {\n return screenfull.exit();\n }\n\n return this.callMethod('exitFullscreen');\n }\n /**\n * Returns true if the player is currently fullscreen.\n * @return {Promise}\n */\n\n }, {\n key: \"getFullscreen\",\n value: function getFullscreen() {\n if (screenfull.isEnabled) {\n return npo_src.resolve(screenfull.isFullscreen);\n }\n\n return this.get('fullscreen');\n }\n /**\n * Request that the player enters picture-in-picture.\n * @return {Promise}\n */\n\n }, {\n key: \"requestPictureInPicture\",\n value: function requestPictureInPicture() {\n return this.callMethod('requestPictureInPicture');\n }\n /**\n * Request that the player exits picture-in-picture.\n * @return {Promise}\n */\n\n }, {\n key: \"exitPictureInPicture\",\n value: function exitPictureInPicture() {\n return this.callMethod('exitPictureInPicture');\n }\n /**\n * Returns true if the player is currently picture-in-picture.\n * @return {Promise}\n */\n\n }, {\n key: \"getPictureInPicture\",\n value: function getPictureInPicture() {\n return this.get('pictureInPicture');\n }\n /**\n * A promise to unload the video.\n *\n * @promise UnloadPromise\n * @fulfill {void} The video was unloaded.\n */\n\n /**\n * Return the player to its initial state.\n *\n * @return {UnloadPromise}\n */\n\n }, {\n key: \"unload\",\n value: function unload() {\n return this.callMethod('unload');\n }\n /**\n * Cleanup the player and remove it from the DOM\n *\n * It won't be usable and a new one should be constructed\n * in order to do any operations.\n *\n * @return {Promise}\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n var _this5 = this;\n\n return new npo_src(function (resolve) {\n readyMap.delete(_this5);\n playerMap.delete(_this5.element);\n\n if (_this5._originalElement) {\n playerMap.delete(_this5._originalElement);\n\n _this5._originalElement.removeAttribute('data-vimeo-initialized');\n }\n\n if (_this5.element && _this5.element.nodeName === 'IFRAME' && _this5.element.parentNode) {\n // If we've added an additional wrapper div, remove that from the DOM.\n // If not, just remove the iframe element.\n if (_this5.element.parentNode.parentNode && _this5._originalElement && _this5._originalElement !== _this5.element.parentNode) {\n _this5.element.parentNode.parentNode.removeChild(_this5.element.parentNode);\n } else {\n _this5.element.parentNode.removeChild(_this5.element);\n }\n } // If the clip is private there is a case where the element stays the\n // div element. Destroy should reset the div and remove the iframe child.\n\n\n if (_this5.element && _this5.element.nodeName === 'DIV' && _this5.element.parentNode) {\n _this5.element.removeAttribute('data-vimeo-initialized');\n\n var iframe = _this5.element.querySelector('iframe');\n\n if (iframe && iframe.parentNode) {\n // If we've added an additional wrapper div, remove that from the DOM.\n // If not, just remove the iframe element.\n if (iframe.parentNode.parentNode && _this5._originalElement && _this5._originalElement !== iframe.parentNode) {\n iframe.parentNode.parentNode.removeChild(iframe.parentNode);\n } else {\n iframe.parentNode.removeChild(iframe);\n }\n }\n }\n\n _this5._window.removeEventListener('message', _this5._onMessage);\n\n if (screenfull.isEnabled) {\n screenfull.off('fullscreenchange', _this5.fullscreenchangeHandler);\n }\n\n resolve();\n });\n }\n /**\n * A promise to get the autopause behavior of the video.\n *\n * @promise GetAutopausePromise\n * @fulfill {boolean} Whether autopause is turned on or off.\n * @reject {UnsupportedError} Autopause is not supported with the current\n * player or browser.\n */\n\n /**\n * Get the autopause behavior for this player.\n *\n * @return {GetAutopausePromise}\n */\n\n }, {\n key: \"getAutopause\",\n value: function getAutopause() {\n return this.get('autopause');\n }\n /**\n * A promise to set the autopause behavior of the video.\n *\n * @promise SetAutopausePromise\n * @fulfill {boolean} Whether autopause is turned on or off.\n * @reject {UnsupportedError} Autopause is not supported with the current\n * player or browser.\n */\n\n /**\n * Enable or disable the autopause behavior of this player.\n *\n * By default, when another video is played in the same browser, this\n * player will automatically pause. Unless you have a specific reason\n * for doing so, we recommend that you leave autopause set to the\n * default (`true`).\n *\n * @param {boolean} autopause\n * @return {SetAutopausePromise}\n */\n\n }, {\n key: \"setAutopause\",\n value: function setAutopause(autopause) {\n return this.set('autopause', autopause);\n }\n /**\n * A promise to get the buffered property of the video.\n *\n * @promise GetBufferedPromise\n * @fulfill {Array} Buffered Timeranges converted to an Array.\n */\n\n /**\n * Get the buffered property of the video.\n *\n * @return {GetBufferedPromise}\n */\n\n }, {\n key: \"getBuffered\",\n value: function getBuffered() {\n return this.get('buffered');\n }\n /**\n * @typedef {Object} CameraProperties\n * @prop {number} props.yaw - Number between 0 and 360.\n * @prop {number} props.pitch - Number between -90 and 90.\n * @prop {number} props.roll - Number between -180 and 180.\n * @prop {number} props.fov - The field of view in degrees.\n */\n\n /**\n * A promise to get the camera properties of the player.\n *\n * @promise GetCameraPromise\n * @fulfill {CameraProperties} The camera properties.\n */\n\n /**\n * For 360° videos get the camera properties for this player.\n *\n * @return {GetCameraPromise}\n */\n\n }, {\n key: \"getCameraProps\",\n value: function getCameraProps() {\n return this.get('cameraProps');\n }\n /**\n * A promise to set the camera properties of the player.\n *\n * @promise SetCameraPromise\n * @fulfill {Object} The camera was successfully set.\n * @reject {RangeError} The range was out of bounds.\n */\n\n /**\n * For 360° videos set the camera properties for this player.\n *\n * @param {CameraProperties} camera The camera properties\n * @return {SetCameraPromise}\n */\n\n }, {\n key: \"setCameraProps\",\n value: function setCameraProps(camera) {\n return this.set('cameraProps', camera);\n }\n /**\n * A representation of a chapter.\n *\n * @typedef {Object} VimeoChapter\n * @property {number} startTime The start time of the chapter.\n * @property {object} title The title of the chapter.\n * @property {number} index The place in the order of Chapters. Starts at 1.\n */\n\n /**\n * A promise to get chapters for the video.\n *\n * @promise GetChaptersPromise\n * @fulfill {VimeoChapter[]} The chapters for the video.\n */\n\n /**\n * Get an array of all the chapters for the video.\n *\n * @return {GetChaptersPromise}\n */\n\n }, {\n key: \"getChapters\",\n value: function getChapters() {\n return this.get('chapters');\n }\n /**\n * A promise to get the currently active chapter.\n *\n * @promise GetCurrentChaptersPromise\n * @fulfill {VimeoChapter|undefined} The current chapter for the video.\n */\n\n /**\n * Get the currently active chapter for the video.\n *\n * @return {GetCurrentChaptersPromise}\n */\n\n }, {\n key: \"getCurrentChapter\",\n value: function getCurrentChapter() {\n return this.get('currentChapter');\n }\n /**\n * A promise to get the color of the player.\n *\n * @promise GetColorPromise\n * @fulfill {string} The hex color of the player.\n */\n\n /**\n * Get the color for this player.\n *\n * @return {GetColorPromise}\n */\n\n }, {\n key: \"getColor\",\n value: function getColor() {\n return this.get('color');\n }\n /**\n * A promise to set the color of the player.\n *\n * @promise SetColorPromise\n * @fulfill {string} The color was successfully set.\n * @reject {TypeError} The string was not a valid hex or rgb color.\n * @reject {ContrastError} The color was set, but the contrast is\n * outside of the acceptable range.\n * @reject {EmbedSettingsError} The owner of the player has chosen to\n * use a specific color.\n */\n\n /**\n * Set the color of this player to a hex or rgb string. Setting the\n * color may fail if the owner of the video has set their embed\n * preferences to force a specific color.\n *\n * @param {string} color The hex or rgb color string to set.\n * @return {SetColorPromise}\n */\n\n }, {\n key: \"setColor\",\n value: function setColor(color) {\n return this.set('color', color);\n }\n /**\n * A representation of a cue point.\n *\n * @typedef {Object} VimeoCuePoint\n * @property {number} time The time of the cue point.\n * @property {object} data The data passed when adding the cue point.\n * @property {string} id The unique id for use with removeCuePoint.\n */\n\n /**\n * A promise to get the cue points of a video.\n *\n * @promise GetCuePointsPromise\n * @fulfill {VimeoCuePoint[]} The cue points added to the video.\n * @reject {UnsupportedError} Cue points are not supported with the current\n * player or browser.\n */\n\n /**\n * Get an array of the cue points added to the video.\n *\n * @return {GetCuePointsPromise}\n */\n\n }, {\n key: \"getCuePoints\",\n value: function getCuePoints() {\n return this.get('cuePoints');\n }\n /**\n * A promise to get the current time of the video.\n *\n * @promise GetCurrentTimePromise\n * @fulfill {number} The current time in seconds.\n */\n\n /**\n * Get the current playback position in seconds.\n *\n * @return {GetCurrentTimePromise}\n */\n\n }, {\n key: \"getCurrentTime\",\n value: function getCurrentTime() {\n return this.get('currentTime');\n }\n /**\n * A promise to set the current time of the video.\n *\n * @promise SetCurrentTimePromise\n * @fulfill {number} The actual current time that was set.\n * @reject {RangeError} the time was less than 0 or greater than the\n * video’s duration.\n */\n\n /**\n * Set the current playback position in seconds. If the player was\n * paused, it will remain paused. Likewise, if the player was playing,\n * it will resume playing once the video has buffered.\n *\n * You can provide an accurate time and the player will attempt to seek\n * to as close to that time as possible. The exact time will be the\n * fulfilled value of the promise.\n *\n * @param {number} currentTime\n * @return {SetCurrentTimePromise}\n */\n\n }, {\n key: \"setCurrentTime\",\n value: function setCurrentTime(currentTime) {\n return this.set('currentTime', currentTime);\n }\n /**\n * A promise to get the duration of the video.\n *\n * @promise GetDurationPromise\n * @fulfill {number} The duration in seconds.\n */\n\n /**\n * Get the duration of the video in seconds. It will be rounded to the\n * nearest second before playback begins, and to the nearest thousandth\n * of a second after playback begins.\n *\n * @return {GetDurationPromise}\n */\n\n }, {\n key: \"getDuration\",\n value: function getDuration() {\n return this.get('duration');\n }\n /**\n * A promise to get the ended state of the video.\n *\n * @promise GetEndedPromise\n * @fulfill {boolean} Whether or not the video has ended.\n */\n\n /**\n * Get the ended state of the video. The video has ended if\n * `currentTime === duration`.\n *\n * @return {GetEndedPromise}\n */\n\n }, {\n key: \"getEnded\",\n value: function getEnded() {\n return this.get('ended');\n }\n /**\n * A promise to get the loop state of the player.\n *\n * @promise GetLoopPromise\n * @fulfill {boolean} Whether or not the player is set to loop.\n */\n\n /**\n * Get the loop state of the player.\n *\n * @return {GetLoopPromise}\n */\n\n }, {\n key: \"getLoop\",\n value: function getLoop() {\n return this.get('loop');\n }\n /**\n * A promise to set the loop state of the player.\n *\n * @promise SetLoopPromise\n * @fulfill {boolean} The loop state that was set.\n */\n\n /**\n * Set the loop state of the player. When set to `true`, the player\n * will start over immediately once playback ends.\n *\n * @param {boolean} loop\n * @return {SetLoopPromise}\n */\n\n }, {\n key: \"setLoop\",\n value: function setLoop(loop) {\n return this.set('loop', loop);\n }\n /**\n * A promise to set the muted state of the player.\n *\n * @promise SetMutedPromise\n * @fulfill {boolean} The muted state that was set.\n */\n\n /**\n * Set the muted state of the player. When set to `true`, the player\n * volume will be muted.\n *\n * @param {boolean} muted\n * @return {SetMutedPromise}\n */\n\n }, {\n key: \"setMuted\",\n value: function setMuted(muted) {\n return this.set('muted', muted);\n }\n /**\n * A promise to get the muted state of the player.\n *\n * @promise GetMutedPromise\n * @fulfill {boolean} Whether or not the player is muted.\n */\n\n /**\n * Get the muted state of the player.\n *\n * @return {GetMutedPromise}\n */\n\n }, {\n key: \"getMuted\",\n value: function getMuted() {\n return this.get('muted');\n }\n /**\n * A promise to get the paused state of the player.\n *\n * @promise GetLoopPromise\n * @fulfill {boolean} Whether or not the video is paused.\n */\n\n /**\n * Get the paused state of the player.\n *\n * @return {GetLoopPromise}\n */\n\n }, {\n key: \"getPaused\",\n value: function getPaused() {\n return this.get('paused');\n }\n /**\n * A promise to get the playback rate of the player.\n *\n * @promise GetPlaybackRatePromise\n * @fulfill {number} The playback rate of the player on a scale from 0.5 to 2.\n */\n\n /**\n * Get the playback rate of the player on a scale from `0.5` to `2`.\n *\n * @return {GetPlaybackRatePromise}\n */\n\n }, {\n key: \"getPlaybackRate\",\n value: function getPlaybackRate() {\n return this.get('playbackRate');\n }\n /**\n * A promise to set the playbackrate of the player.\n *\n * @promise SetPlaybackRatePromise\n * @fulfill {number} The playback rate was set.\n * @reject {RangeError} The playback rate was less than 0.5 or greater than 2.\n */\n\n /**\n * Set the playback rate of the player on a scale from `0.5` to `2`. When set\n * via the API, the playback rate will not be synchronized to other\n * players or stored as the viewer's preference.\n *\n * @param {number} playbackRate\n * @return {SetPlaybackRatePromise}\n */\n\n }, {\n key: \"setPlaybackRate\",\n value: function setPlaybackRate(playbackRate) {\n return this.set('playbackRate', playbackRate);\n }\n /**\n * A promise to get the played property of the video.\n *\n * @promise GetPlayedPromise\n * @fulfill {Array} Played Timeranges converted to an Array.\n */\n\n /**\n * Get the played property of the video.\n *\n * @return {GetPlayedPromise}\n */\n\n }, {\n key: \"getPlayed\",\n value: function getPlayed() {\n return this.get('played');\n }\n /**\n * A promise to get the qualities available of the current video.\n *\n * @promise GetQualitiesPromise\n * @fulfill {Array} The qualities of the video.\n */\n\n /**\n * Get the qualities of the current video.\n *\n * @return {GetQualitiesPromise}\n */\n\n }, {\n key: \"getQualities\",\n value: function getQualities() {\n return this.get('qualities');\n }\n /**\n * A promise to get the current set quality of the video.\n *\n * @promise GetQualityPromise\n * @fulfill {string} The current set quality.\n */\n\n /**\n * Get the current set quality of the video.\n *\n * @return {GetQualityPromise}\n */\n\n }, {\n key: \"getQuality\",\n value: function getQuality() {\n return this.get('quality');\n }\n /**\n * A promise to set the video quality.\n *\n * @promise SetQualityPromise\n * @fulfill {number} The quality was set.\n * @reject {RangeError} The quality is not available.\n */\n\n /**\n * Set a video quality.\n *\n * @param {string} quality\n * @return {SetQualityPromise}\n */\n\n }, {\n key: \"setQuality\",\n value: function setQuality(quality) {\n return this.set('quality', quality);\n }\n /**\n * A promise to get the seekable property of the video.\n *\n * @promise GetSeekablePromise\n * @fulfill {Array} Seekable Timeranges converted to an Array.\n */\n\n /**\n * Get the seekable property of the video.\n *\n * @return {GetSeekablePromise}\n */\n\n }, {\n key: \"getSeekable\",\n value: function getSeekable() {\n return this.get('seekable');\n }\n /**\n * A promise to get the seeking property of the player.\n *\n * @promise GetSeekingPromise\n * @fulfill {boolean} Whether or not the player is currently seeking.\n */\n\n /**\n * Get if the player is currently seeking.\n *\n * @return {GetSeekingPromise}\n */\n\n }, {\n key: \"getSeeking\",\n value: function getSeeking() {\n return this.get('seeking');\n }\n /**\n * A promise to get the text tracks of a video.\n *\n * @promise GetTextTracksPromise\n * @fulfill {VimeoTextTrack[]} The text tracks associated with the video.\n */\n\n /**\n * Get an array of the text tracks that exist for the video.\n *\n * @return {GetTextTracksPromise}\n */\n\n }, {\n key: \"getTextTracks\",\n value: function getTextTracks() {\n return this.get('textTracks');\n }\n /**\n * A promise to get the embed code for the video.\n *\n * @promise GetVideoEmbedCodePromise\n * @fulfill {string} The `<iframe>` embed code for the video.\n */\n\n /**\n * Get the `<iframe>` embed code for the video.\n *\n * @return {GetVideoEmbedCodePromise}\n */\n\n }, {\n key: \"getVideoEmbedCode\",\n value: function getVideoEmbedCode() {\n return this.get('videoEmbedCode');\n }\n /**\n * A promise to get the id of the video.\n *\n * @promise GetVideoIdPromise\n * @fulfill {number} The id of the video.\n */\n\n /**\n * Get the id of the video.\n *\n * @return {GetVideoIdPromise}\n */\n\n }, {\n key: \"getVideoId\",\n value: function getVideoId() {\n return this.get('videoId');\n }\n /**\n * A promise to get the title of the video.\n *\n * @promise GetVideoTitlePromise\n * @fulfill {number} The title of the video.\n */\n\n /**\n * Get the title of the video.\n *\n * @return {GetVideoTitlePromise}\n */\n\n }, {\n key: \"getVideoTitle\",\n value: function getVideoTitle() {\n return this.get('videoTitle');\n }\n /**\n * A promise to get the native width of the video.\n *\n * @promise GetVideoWidthPromise\n * @fulfill {number} The native width of the video.\n */\n\n /**\n * Get the native width of the currently‐playing video. The width of\n * the highest‐resolution available will be used before playback begins.\n *\n * @return {GetVideoWidthPromise}\n */\n\n }, {\n key: \"getVideoWidth\",\n value: function getVideoWidth() {\n return this.get('videoWidth');\n }\n /**\n * A promise to get the native height of the video.\n *\n * @promise GetVideoHeightPromise\n * @fulfill {number} The native height of the video.\n */\n\n /**\n * Get the native height of the currently‐playing video. The height of\n * the highest‐resolution available will be used before playback begins.\n *\n * @return {GetVideoHeightPromise}\n */\n\n }, {\n key: \"getVideoHeight\",\n value: function getVideoHeight() {\n return this.get('videoHeight');\n }\n /**\n * A promise to get the vimeo.com url for the video.\n *\n * @promise GetVideoUrlPromise\n * @fulfill {number} The vimeo.com url for the video.\n * @reject {PrivacyError} The url isn’t available because of the video’s privacy setting.\n */\n\n /**\n * Get the vimeo.com url for the video.\n *\n * @return {GetVideoUrlPromise}\n */\n\n }, {\n key: \"getVideoUrl\",\n value: function getVideoUrl() {\n return this.get('videoUrl');\n }\n /**\n * A promise to get the volume level of the player.\n *\n * @promise GetVolumePromise\n * @fulfill {number} The volume level of the player on a scale from 0 to 1.\n */\n\n /**\n * Get the current volume level of the player on a scale from `0` to `1`.\n *\n * Most mobile devices do not support an independent volume from the\n * system volume. In those cases, this method will always return `1`.\n *\n * @return {GetVolumePromise}\n */\n\n }, {\n key: \"getVolume\",\n value: function getVolume() {\n return this.get('volume');\n }\n /**\n * A promise to set the volume level of the player.\n *\n * @promise SetVolumePromise\n * @fulfill {number} The volume was set.\n * @reject {RangeError} The volume was less than 0 or greater than 1.\n */\n\n /**\n * Set the volume of the player on a scale from `0` to `1`. When set\n * via the API, the volume level will not be synchronized to other\n * players or stored as the viewer’s preference.\n *\n * Most mobile devices do not support setting the volume. An error will\n * *not* be triggered in that situation.\n *\n * @param {number} volume\n * @return {SetVolumePromise}\n */\n\n }, {\n key: \"setVolume\",\n value: function setVolume(volume) {\n return this.set('volume', volume);\n }\n }]);\n\n return Player;\n}(); // Setup embed only if this is not a node environment\n\n\nif (!isNode) {\n screenfull = initializeScreenfull();\n initializeEmbeds();\n resizeEmbeds();\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Player);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZpbWVvL3BsYXllci9kaXN0L3BsYXllci5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHZpbWVvL3BsYXllci9kaXN0L3BsYXllci5lcy5qcz84NGM5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qISBAdmltZW8vcGxheWVyIHYyLjE2LjEgfCAoYykgMjAyMSBWaW1lbyB8IE1JVCBMaWNlbnNlIHwgaHR0cHM6Ly9naXRodWIuY29tL3ZpbWVvL3BsYXllci5qcyAqL1xuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIEBtb2R1bGUgbGliL2Z1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIHRoaXMgaXMgYSBub2RlIGVudmlyb25tZW50LlxuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cblxuLyogZ2xvYmFsIGdsb2JhbCAqL1xudmFyIGlzTm9kZSA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsKSA9PT0gJ1tvYmplY3QgZ2xvYmFsXSc7XG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGZvciBhIGdpdmVuIGdldHRlciBvciBzZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWl0aGVyIOKAnGdldOKAnSBvciDigJxzZXTigJ0uXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TWV0aG9kTmFtZShwcm9wLCB0eXBlKSB7XG4gIGlmIChwcm9wLmluZGV4T2YodHlwZS50b0xvd2VyQ2FzZSgpKSA9PT0gMCkge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG5cbiAgcmV0dXJuIFwiXCIuY29uY2F0KHR5cGUudG9Mb3dlckNhc2UoKSkuY29uY2F0KHByb3Auc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkpLmNvbmNhdChwcm9wLnN1YnN0cigxKSk7XG59XG4vKipcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0IGlzIGEgRE9NIEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGlzRG9tRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBCb29sZWFuKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiAnbm9kZU5hbWUnIGluIGVsZW1lbnQgJiYgZWxlbWVudC5vd25lckRvY3VtZW50ICYmIGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyk7XG59XG4vKipcbiAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMzUxNDYvanMvdGVzdHMvaXNOdW1iZXIuaHRtbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGludGVnZXIgQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PSB2YWx1ZTtcbn1cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVUkwgaXMgYSBWaW1lbyB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgdXJsIHN0cmluZy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuZnVuY3Rpb24gaXNWaW1lb1VybCh1cmwpIHtcbiAgcmV0dXJuIC9eKGh0dHBzPzopP1xcL1xcLygocGxheWVyfHd3dylcXC4pP3ZpbWVvXFwuY29tKD89JHxcXC8pLy50ZXN0KHVybCk7XG59XG4vKipcbiAqIEdldCB0aGUgVmltZW8gVVJMIGZyb20gYW4gZWxlbWVudC5cbiAqIFRoZSBlbGVtZW50IG11c3QgaGF2ZSBlaXRoZXIgYSBkYXRhLXZpbWVvLWlkIG9yIGRhdGEtdmltZW8tdXJsIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb0VtYmVkUGFyYW1ldGVycyBUaGUgb0VtYmVkIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZ2V0VmltZW9VcmwoKSB7XG4gIHZhciBvRW1iZWRQYXJhbWV0ZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgdmFyIGlkID0gb0VtYmVkUGFyYW1ldGVycy5pZDtcbiAgdmFyIHVybCA9IG9FbWJlZFBhcmFtZXRlcnMudXJsO1xuICB2YXIgaWRPclVybCA9IGlkIHx8IHVybDtcblxuICBpZiAoIWlkT3JVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGlkIG9yIHVybCBtdXN0IGJlIHBhc3NlZCwgZWl0aGVyIGluIGFuIG9wdGlvbnMgb2JqZWN0IG9yIGFzIGEgZGF0YS12aW1lby1pZCBvciBkYXRhLXZpbWVvLXVybCBhdHRyaWJ1dGUuJyk7XG4gIH1cblxuICBpZiAoaXNJbnRlZ2VyKGlkT3JVcmwpKSB7XG4gICAgcmV0dXJuIFwiaHR0cHM6Ly92aW1lby5jb20vXCIuY29uY2F0KGlkT3JVcmwpO1xuICB9XG5cbiAgaWYgKGlzVmltZW9VcmwoaWRPclVybCkpIHtcbiAgICByZXR1cm4gaWRPclVybC5yZXBsYWNlKCdodHRwOicsICdodHRwczonKTtcbiAgfVxuXG4gIGlmIChpZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJcXHUyMDFDXCIuY29uY2F0KGlkLCBcIlxcdTIwMUQgaXMgbm90IGEgdmFsaWQgdmlkZW8gaWQuXCIpKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJcXHUyMDFDXCIuY29uY2F0KGlkT3JVcmwsIFwiXFx1MjAxRCBpcyBub3QgYSB2aW1lby5jb20gdXJsLlwiKSk7XG59XG5cbnZhciBhcnJheUluZGV4T2ZTdXBwb3J0ID0gdHlwZW9mIEFycmF5LnByb3RvdHlwZS5pbmRleE9mICE9PSAndW5kZWZpbmVkJztcbnZhciBwb3N0TWVzc2FnZVN1cHBvcnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LnBvc3RNZXNzYWdlICE9PSAndW5kZWZpbmVkJztcblxuaWYgKCFpc05vZGUgJiYgKCFhcnJheUluZGV4T2ZTdXBwb3J0IHx8ICFwb3N0TWVzc2FnZVN1cHBvcnQpKSB7XG4gIHRocm93IG5ldyBFcnJvcignU29ycnksIHRoZSBWaW1lbyBQbGF5ZXIgQVBJIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBicm93c2VyLicpO1xufVxuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkge1xuXHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8qIVxuICogd2Vha21hcC1wb2x5ZmlsbCB2Mi4wLjEgLSBFQ01BU2NyaXB0NiBXZWFrTWFwIHBvbHlmaWxsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcG9seWdvbnBsYW5ldC93ZWFrbWFwLXBvbHlmaWxsXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBQb2x5Z29uIFBsYW5ldCA8cG9seWdvbi5wbGFuZXQuYXF1YUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuKGZ1bmN0aW9uIChzZWxmKSB7XG5cbiAgaWYgKHNlbGYuV2Vha01hcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfTtcblxuICBzZWxmLldlYWtNYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRUNNQS0yNjIgMjMuMyBXZWFrTWFwIE9iamVjdHNcbiAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgaWYgKHRoaXMgPT09IHZvaWQgMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29uc3RydWN0b3IgV2Vha01hcCByZXF1aXJlcyAnbmV3J1wiKTtcbiAgICAgIH1cblxuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ19pZCcsIGdlbklkKCdfV2Vha01hcCcpKTsgLy8gRUNNQS0yNjIgMjMuMy4xLjEgV2Vha01hcChbaXRlcmFibGVdKVxuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQ3VycmVudGx5LCBXZWFrTWFwIGBpdGVyYWJsZWAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXZWFrTWFwIGl0ZXJhYmxlIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICB9IC8vIEVDTUEtMjYyIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG5cblxuICAgIGRlZmluZVByb3BlcnR5KFdlYWtNYXAucHJvdG90eXBlLCAnZGVsZXRlJywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgY2hlY2tJbnN0YW5jZSh0aGlzLCAnZGVsZXRlJyk7XG5cbiAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIGRlbGV0ZSBrZXlbdGhpcy5faWRdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pOyAvLyBFQ01BLTI2MiAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuXG4gICAgZGVmaW5lUHJvcGVydHkoV2Vha01hcC5wcm90b3R5cGUsICdnZXQnLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBjaGVja0luc3RhbmNlKHRoaXMsICdnZXQnKTtcblxuICAgICAgaWYgKCFpc09iamVjdChrZXkpKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBlbnRyeVsxXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9KTsgLy8gRUNNQS0yNjIgMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcblxuICAgIGRlZmluZVByb3BlcnR5KFdlYWtNYXAucHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgY2hlY2tJbnN0YW5jZSh0aGlzLCAnaGFzJyk7XG5cbiAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7IC8vIEVDTUEtMjYyIDIzLjMuMy41IFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuXG4gICAgZGVmaW5lUHJvcGVydHkoV2Vha01hcC5wcm90b3R5cGUsICdzZXQnLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgY2hlY2tJbnN0YW5jZSh0aGlzLCAnc2V0Jyk7XG5cbiAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHZhbHVlIHVzZWQgYXMgd2VhayBtYXAga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIGVudHJ5WzFdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX2lkLCBba2V5LCB2YWx1ZV0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjaGVja0luc3RhbmNlKHgsIG1ldGhvZE5hbWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QoeCkgfHwgIWhhc093blByb3BlcnR5LmNhbGwoeCwgJ19pZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWV0aG9kTmFtZSArICcgbWV0aG9kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXIgJyArIHR5cGVvZiB4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5JZChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyAnXycgKyByYW5kKCkgKyAnLicgKyByYW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmFuZCgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xuICAgIH1cblxuICAgIGRlZmluZVByb3BlcnR5KFdlYWtNYXAsICdfcG9seWZpbGwnLCB0cnVlKTtcbiAgICByZXR1cm4gV2Vha01hcDtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gT2JqZWN0KHgpID09PSB4O1xuICB9XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgY29tbW9uanNHbG9iYWwgIT09ICd1bmRlZmluZWQnID8gY29tbW9uanNHbG9iYWwgOiBjb21tb25qc0dsb2JhbCk7XG5cbnZhciBucG9fc3JjID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLyohIE5hdGl2ZSBQcm9taXNlIE9ubHlcbiAgICB2MC44LjEgKGMpIEt5bGUgU2ltcHNvblxuICAgIE1JVCBMaWNlbnNlOiBodHRwOi8vZ2V0aWZ5Lm1pdC1saWNlbnNlLm9yZ1xuKi9cbihmdW5jdGlvbiBVTUQobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICAvLyBzcGVjaWFsIGZvcm0gb2YgVU1EIGZvciBwb2x5ZmlsbGluZyBhY3Jvc3MgZXZpcm9ubWVudHNcbiAgY29udGV4dFtuYW1lXSA9IGNvbnRleHRbbmFtZV0gfHwgZGVmaW5pdGlvbigpO1xuXG4gIGlmICggbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGNvbnRleHRbbmFtZV07XG4gIH1cbn0pKFwiUHJvbWlzZVwiLCB0eXBlb2YgY29tbW9uanNHbG9iYWwgIT0gXCJ1bmRlZmluZWRcIiA/IGNvbW1vbmpzR2xvYmFsIDogY29tbW9uanNHbG9iYWwsIGZ1bmN0aW9uIERFRigpIHtcblxuICB2YXIgYnVpbHRJblByb3AsXG4gICAgICBjeWNsZSxcbiAgICAgIHNjaGVkdWxpbmdfcXVldWUsXG4gICAgICBUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgICB0aW1lciA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT0gXCJ1bmRlZmluZWRcIiA/IGZ1bmN0aW9uIHRpbWVyKGZuKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZShmbik7XG4gIH0gOiBzZXRUaW1lb3V0OyAvLyBkYW1taXQsIElFOC5cblxuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgXCJ4XCIsIHt9KTtcblxuICAgIGJ1aWx0SW5Qcm9wID0gZnVuY3Rpb24gYnVpbHRJblByb3Aob2JqLCBuYW1lLCB2YWwsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHtcbiAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlnICE9PSBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYnVpbHRJblByb3AgPSBmdW5jdGlvbiBidWlsdEluUHJvcChvYmosIG5hbWUsIHZhbCkge1xuICAgICAgb2JqW25hbWVdID0gdmFsO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9IC8vIE5vdGU6IHVzaW5nIGEgcXVldWUgaW5zdGVhZCBvZiBhcnJheSBmb3IgZWZmaWNpZW5jeVxuXG5cbiAgc2NoZWR1bGluZ19xdWV1ZSA9IGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgIHZhciBmaXJzdCwgbGFzdCwgaXRlbTtcblxuICAgIGZ1bmN0aW9uIEl0ZW0oZm4sIHNlbGYpIHtcbiAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gICAgICB0aGlzLm5leHQgPSB2b2lkIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKGZuLCBzZWxmKSB7XG4gICAgICAgIGl0ZW0gPSBuZXcgSXRlbShmbiwgc2VsZik7XG5cbiAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICBsYXN0Lm5leHQgPSBpdGVtO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpcnN0ID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3QgPSBpdGVtO1xuICAgICAgICBpdGVtID0gdm9pZCAwO1xuICAgICAgfSxcbiAgICAgIGRyYWluOiBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICAgICAgdmFyIGYgPSBmaXJzdDtcbiAgICAgICAgZmlyc3QgPSBsYXN0ID0gY3ljbGUgPSB2b2lkIDA7XG5cbiAgICAgICAgd2hpbGUgKGYpIHtcbiAgICAgICAgICBmLmZuLmNhbGwoZi5zZWxmKTtcbiAgICAgICAgICBmID0gZi5uZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGZuLCBzZWxmKSB7XG4gICAgc2NoZWR1bGluZ19xdWV1ZS5hZGQoZm4sIHNlbGYpO1xuXG4gICAgaWYgKCFjeWNsZSkge1xuICAgICAgY3ljbGUgPSB0aW1lcihzY2hlZHVsaW5nX3F1ZXVlLmRyYWluKTtcbiAgICB9XG4gIH0gLy8gcHJvbWlzZSBkdWNrIHR5cGluZ1xuXG5cbiAgZnVuY3Rpb24gaXNUaGVuYWJsZShvKSB7XG4gICAgdmFyIF90aGVuLFxuICAgICAgICBvX3R5cGUgPSB0eXBlb2YgbztcblxuICAgIGlmIChvICE9IG51bGwgJiYgKG9fdHlwZSA9PSBcIm9iamVjdFwiIHx8IG9fdHlwZSA9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICBfdGhlbiA9IG8udGhlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIF90aGVuID09IFwiZnVuY3Rpb25cIiA/IF90aGVuIDogZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoYWluLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub3RpZnlJc29sYXRlZCh0aGlzLCB0aGlzLnN0YXRlID09PSAxID8gdGhpcy5jaGFpbltpXS5zdWNjZXNzIDogdGhpcy5jaGFpbltpXS5mYWlsdXJlLCB0aGlzLmNoYWluW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYWluLmxlbmd0aCA9IDA7XG4gIH0gLy8gTk9URTogVGhpcyBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGlzb2xhdGVcbiAgLy8gdGhlIGB0cnkuLmNhdGNoYCBzbyB0aGF0IG90aGVyIGNvZGUgY2FuIGJlXG4gIC8vIG9wdGltaXplZCBiZXR0ZXJcblxuXG4gIGZ1bmN0aW9uIG5vdGlmeUlzb2xhdGVkKHNlbGYsIGNiLCBjaGFpbikge1xuICAgIHZhciByZXQsIF90aGVuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjYiA9PT0gZmFsc2UpIHtcbiAgICAgICAgY2hhaW4ucmVqZWN0KHNlbGYubXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjYiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldCA9IHNlbGYubXNnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGNiLmNhbGwodm9pZCAwLCBzZWxmLm1zZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0ID09PSBjaGFpbi5wcm9taXNlKSB7XG4gICAgICAgICAgY2hhaW4ucmVqZWN0KFR5cGVFcnJvcihcIlByb21pc2UtY2hhaW4gY3ljbGVcIikpO1xuICAgICAgICB9IGVsc2UgaWYgKF90aGVuID0gaXNUaGVuYWJsZShyZXQpKSB7XG4gICAgICAgICAgX3RoZW4uY2FsbChyZXQsIGNoYWluLnJlc29sdmUsIGNoYWluLnJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhaW4ucmVzb2x2ZShyZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjaGFpbi5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlKG1zZykge1xuICAgIHZhciBfdGhlbixcbiAgICAgICAgc2VsZiA9IHRoaXM7IC8vIGFscmVhZHkgdHJpZ2dlcmVkP1xuXG5cbiAgICBpZiAoc2VsZi50cmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLnRyaWdnZXJlZCA9IHRydWU7IC8vIHVud3JhcFxuXG4gICAgaWYgKHNlbGYuZGVmKSB7XG4gICAgICBzZWxmID0gc2VsZi5kZWY7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChfdGhlbiA9IGlzVGhlbmFibGUobXNnKSkge1xuICAgICAgICBzY2hlZHVsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRlZl93cmFwcGVyID0gbmV3IE1ha2VEZWZXcmFwcGVyKHNlbGYpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGVuLmNhbGwobXNnLCBmdW5jdGlvbiAkcmVzb2x2ZSQoKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUuYXBwbHkoZGVmX3dyYXBwZXIsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAkcmVqZWN0JCgpIHtcbiAgICAgICAgICAgICAgcmVqZWN0LmFwcGx5KGRlZl93cmFwcGVyLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QuY2FsbChkZWZfd3JhcHBlciwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5tc2cgPSBtc2c7XG4gICAgICAgIHNlbGYuc3RhdGUgPSAxO1xuXG4gICAgICAgIGlmIChzZWxmLmNoYWluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzY2hlZHVsZShub3RpZnksIHNlbGYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZWplY3QuY2FsbChuZXcgTWFrZURlZldyYXBwZXIoc2VsZiksIGVycik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0KG1zZykge1xuICAgIHZhciBzZWxmID0gdGhpczsgLy8gYWxyZWFkeSB0cmlnZ2VyZWQ/XG5cbiAgICBpZiAoc2VsZi50cmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLnRyaWdnZXJlZCA9IHRydWU7IC8vIHVud3JhcFxuXG4gICAgaWYgKHNlbGYuZGVmKSB7XG4gICAgICBzZWxmID0gc2VsZi5kZWY7XG4gICAgfVxuXG4gICAgc2VsZi5tc2cgPSBtc2c7XG4gICAgc2VsZi5zdGF0ZSA9IDI7XG5cbiAgICBpZiAoc2VsZi5jaGFpbi5sZW5ndGggPiAwKSB7XG4gICAgICBzY2hlZHVsZShub3RpZnksIHNlbGYpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVQcm9taXNlcyhDb25zdHJ1Y3RvciwgYXJyLCByZXNvbHZlciwgcmVqZWN0ZXIpIHtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgKGZ1bmN0aW9uIElJRkUoaWR4KSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnJlc29sdmUoYXJyW2lkeF0pLnRoZW4oZnVuY3Rpb24gJHJlc29sdmVyJChtc2cpIHtcbiAgICAgICAgICByZXNvbHZlcihpZHgsIG1zZyk7XG4gICAgICAgIH0sIHJlamVjdGVyKTtcbiAgICAgIH0pKGlkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gTWFrZURlZldyYXBwZXIoc2VsZikge1xuICAgIHRoaXMuZGVmID0gc2VsZjtcbiAgICB0aGlzLnRyaWdnZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gTWFrZURlZihzZWxmKSB7XG4gICAgdGhpcy5wcm9taXNlID0gc2VsZjtcbiAgICB0aGlzLnN0YXRlID0gMDtcbiAgICB0aGlzLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2hhaW4gPSBbXTtcbiAgICB0aGlzLm1zZyA9IHZvaWQgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX19OUE9fXyAhPT0gMCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiTm90IGEgcHJvbWlzZVwiKTtcbiAgICB9IC8vIGluc3RhbmNlIHNoYWRvd2luZyB0aGUgaW5oZXJpdGVkIFwiYnJhbmRcIlxuICAgIC8vIHRvIHNpZ25hbCBhbiBhbHJlYWR5IFwiaW5pdGlhbGl6ZWRcIiBwcm9taXNlXG5cblxuICAgIHRoaXMuX19OUE9fXyA9IDE7XG4gICAgdmFyIGRlZiA9IG5ldyBNYWtlRGVmKHRoaXMpO1xuXG4gICAgdGhpc1tcInRoZW5cIl0gPSBmdW5jdGlvbiB0aGVuKHN1Y2Nlc3MsIGZhaWx1cmUpIHtcbiAgICAgIHZhciBvID0ge1xuICAgICAgICBzdWNjZXNzOiB0eXBlb2Ygc3VjY2VzcyA9PSBcImZ1bmN0aW9uXCIgPyBzdWNjZXNzIDogdHJ1ZSxcbiAgICAgICAgZmFpbHVyZTogdHlwZW9mIGZhaWx1cmUgPT0gXCJmdW5jdGlvblwiID8gZmFpbHVyZSA6IGZhbHNlXG4gICAgICB9OyAvLyBOb3RlOiBgdGhlbiguLilgIGl0c2VsZiBjYW4gYmUgYm9ycm93ZWQgdG8gYmUgdXNlZCBhZ2FpbnN0XG4gICAgICAvLyBhIGRpZmZlcmVudCBwcm9taXNlIGNvbnN0cnVjdG9yIGZvciBtYWtpbmcgdGhlIGNoYWluZWQgcHJvbWlzZSxcbiAgICAgIC8vIGJ5IHN1YnN0aXR1dGluZyBhIGRpZmZlcmVudCBgdGhpc2AgYmluZGluZy5cblxuICAgICAgby5wcm9taXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZnVuY3Rpb24gZXh0cmFjdENoYWluKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBvLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICBvLnJlamVjdCA9IHJlamVjdDtcbiAgICAgIH0pO1xuICAgICAgZGVmLmNoYWluLnB1c2gobyk7XG5cbiAgICAgIGlmIChkZWYuc3RhdGUgIT09IDApIHtcbiAgICAgICAgc2NoZWR1bGUobm90aWZ5LCBkZWYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gby5wcm9taXNlO1xuICAgIH07XG5cbiAgICB0aGlzW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbiAkY2F0Y2gkKGZhaWx1cmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBmYWlsdXJlKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yLmNhbGwodm9pZCAwLCBmdW5jdGlvbiBwdWJsaWNSZXNvbHZlKG1zZykge1xuICAgICAgICByZXNvbHZlLmNhbGwoZGVmLCBtc2cpO1xuICAgICAgfSwgZnVuY3Rpb24gcHVibGljUmVqZWN0KG1zZykge1xuICAgICAgICByZWplY3QuY2FsbChkZWYsIG1zZyk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlamVjdC5jYWxsKGRlZiwgZXJyKTtcbiAgICB9XG4gIH1cblxuICB2YXIgUHJvbWlzZVByb3RvdHlwZSA9IGJ1aWx0SW5Qcm9wKHt9LCBcImNvbnN0cnVjdG9yXCIsIFByb21pc2UsXG4gIC8qY29uZmlndXJhYmxlPSovXG4gIGZhbHNlKTsgLy8gTm90ZTogQW5kcm9pZCA0IGNhbm5vdCB1c2UgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSguLilgIGhlcmVcblxuICBQcm9taXNlLnByb3RvdHlwZSA9IFByb21pc2VQcm90b3R5cGU7IC8vIGJ1aWx0LWluIFwiYnJhbmRcIiB0byBzaWduYWwgYW4gXCJ1bmluaXRpYWxpemVkXCIgcHJvbWlzZVxuXG4gIGJ1aWx0SW5Qcm9wKFByb21pc2VQcm90b3R5cGUsIFwiX19OUE9fX1wiLCAwLFxuICAvKmNvbmZpZ3VyYWJsZT0qL1xuICBmYWxzZSk7XG4gIGJ1aWx0SW5Qcm9wKFByb21pc2UsIFwicmVzb2x2ZVwiLCBmdW5jdGlvbiBQcm9taXNlJHJlc29sdmUobXNnKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsgLy8gc3BlYyBtYW5kYXRlZCBjaGVja3NcbiAgICAvLyBub3RlOiBiZXN0IFwiaXNQcm9taXNlXCIgY2hlY2sgdGhhdCdzIHByYWN0aWNhbCBmb3Igbm93XG5cbiAgICBpZiAobXNnICYmIHR5cGVvZiBtc2cgPT0gXCJvYmplY3RcIiAmJiBtc2cuX19OUE9fXyA9PT0gMSkge1xuICAgICAgcmV0dXJuIG1zZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShtc2cpO1xuICAgIH0pO1xuICB9KTtcbiAgYnVpbHRJblByb3AoUHJvbWlzZSwgXCJyZWplY3RcIiwgZnVuY3Rpb24gUHJvbWlzZSRyZWplY3QobXNnKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG1zZyk7XG4gICAgfSk7XG4gIH0pO1xuICBidWlsdEluUHJvcChQcm9taXNlLCBcImFsbFwiLCBmdW5jdGlvbiBQcm9taXNlJGFsbChhcnIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOyAvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXG4gICAgaWYgKFRvU3RyaW5nLmNhbGwoYXJyKSAhPSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgIHJldHVybiBDb25zdHJ1Y3Rvci5yZWplY3QoVHlwZUVycm9yKFwiTm90IGFuIGFycmF5XCIpKTtcbiAgICB9XG5cbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIENvbnN0cnVjdG9yLnJlc29sdmUoW10pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuID0gYXJyLmxlbmd0aCxcbiAgICAgICAgICBtc2dzID0gQXJyYXkobGVuKSxcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICBpdGVyYXRlUHJvbWlzZXMoQ29uc3RydWN0b3IsIGFyciwgZnVuY3Rpb24gcmVzb2x2ZXIoaWR4LCBtc2cpIHtcbiAgICAgICAgbXNnc1tpZHhdID0gbXNnO1xuXG4gICAgICAgIGlmICgrK2NvdW50ID09PSBsZW4pIHtcbiAgICAgICAgICByZXNvbHZlKG1zZ3MpO1xuICAgICAgICB9XG4gICAgICB9LCByZWplY3QpO1xuICAgIH0pO1xuICB9KTtcbiAgYnVpbHRJblByb3AoUHJvbWlzZSwgXCJyYWNlXCIsIGZ1bmN0aW9uIFByb21pc2UkcmFjZShhcnIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOyAvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXG4gICAgaWYgKFRvU3RyaW5nLmNhbGwoYXJyKSAhPSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgIHJldHVybiBDb25zdHJ1Y3Rvci5yZWplY3QoVHlwZUVycm9yKFwiTm90IGFuIGFycmF5XCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgaXRlcmF0ZVByb21pc2VzKENvbnN0cnVjdG9yLCBhcnIsIGZ1bmN0aW9uIHJlc29sdmVyKGlkeCwgbXNnKSB7XG4gICAgICAgIHJlc29sdmUobXNnKTtcbiAgICAgIH0sIHJlamVjdCk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZTtcbn0pO1xufSk7XG5cbi8qKlxuICogQG1vZHVsZSBsaWIvY2FsbGJhY2tzXG4gKi9cbnZhciBjYWxsYmFja01hcCA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIFN0b3JlIGEgY2FsbGJhY2sgZm9yIGEgbWV0aG9kIG9yIGV2ZW50IGZvciBhIHBsYXllci5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1ldGhvZCBvciBldmVudCBuYW1lLlxuICogQHBhcmFtIHsoZnVuY3Rpb24odGhpczpQbGF5ZXIsICopOiB2b2lkfHtyZXNvbHZlOiBmdW5jdGlvbiwgcmVqZWN0OiBmdW5jdGlvbn0pfSBjYWxsYmFja1xuICogICAgICAgIFRoZSBjYWxsYmFjayB0byBjYWxsIG9yIGFuIG9iamVjdCB3aXRoIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnMgZm9yIGEgcHJvbWlzZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cblxuZnVuY3Rpb24gc3RvcmVDYWxsYmFjayhwbGF5ZXIsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIHZhciBwbGF5ZXJDYWxsYmFja3MgPSBjYWxsYmFja01hcC5nZXQocGxheWVyLmVsZW1lbnQpIHx8IHt9O1xuXG4gIGlmICghKG5hbWUgaW4gcGxheWVyQ2FsbGJhY2tzKSkge1xuICAgIHBsYXllckNhbGxiYWNrc1tuYW1lXSA9IFtdO1xuICB9XG5cbiAgcGxheWVyQ2FsbGJhY2tzW25hbWVdLnB1c2goY2FsbGJhY2spO1xuICBjYWxsYmFja01hcC5zZXQocGxheWVyLmVsZW1lbnQsIHBsYXllckNhbGxiYWNrcyk7XG59XG4vKipcbiAqIEdldCB0aGUgY2FsbGJhY2tzIGZvciBhIHBsYXllciBhbmQgZXZlbnQgb3IgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbWV0aG9kIG9yIGV2ZW50IG5hbWVcbiAqIEByZXR1cm4ge2Z1bmN0aW9uW119XG4gKi9cblxuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tzKHBsYXllciwgbmFtZSkge1xuICB2YXIgcGxheWVyQ2FsbGJhY2tzID0gY2FsbGJhY2tNYXAuZ2V0KHBsYXllci5lbGVtZW50KSB8fCB7fTtcbiAgcmV0dXJuIHBsYXllckNhbGxiYWNrc1tuYW1lXSB8fCBbXTtcbn1cbi8qKlxuICogUmVtb3ZlIGEgc3RvcmVkIGNhbGxiYWNrIGZvciBhIG1ldGhvZCBvciBldmVudCBmb3IgYSBwbGF5ZXIuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBtZXRob2Qgb3IgZXZlbnQgbmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgc3BlY2lmaWMgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2FzIHRoaXMgdGhlIGxhc3QgY2FsbGJhY2s/XG4gKi9cblxuZnVuY3Rpb24gcmVtb3ZlQ2FsbGJhY2socGxheWVyLCBuYW1lLCBjYWxsYmFjaykge1xuICB2YXIgcGxheWVyQ2FsbGJhY2tzID0gY2FsbGJhY2tNYXAuZ2V0KHBsYXllci5lbGVtZW50KSB8fCB7fTtcblxuICBpZiAoIXBsYXllckNhbGxiYWNrc1tuYW1lXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZCwgcmVtb3ZlIGFsbCBjYWxsYmFja3MgZm9yIHRoZSBldmVudFxuXG5cbiAgaWYgKCFjYWxsYmFjaykge1xuICAgIHBsYXllckNhbGxiYWNrc1tuYW1lXSA9IFtdO1xuICAgIGNhbGxiYWNrTWFwLnNldChwbGF5ZXIuZWxlbWVudCwgcGxheWVyQ2FsbGJhY2tzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHBsYXllckNhbGxiYWNrc1tuYW1lXS5pbmRleE9mKGNhbGxiYWNrKTtcblxuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgcGxheWVyQ2FsbGJhY2tzW25hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBjYWxsYmFja01hcC5zZXQocGxheWVyLmVsZW1lbnQsIHBsYXllckNhbGxiYWNrcyk7XG4gIHJldHVybiBwbGF5ZXJDYWxsYmFja3NbbmFtZV0gJiYgcGxheWVyQ2FsbGJhY2tzW25hbWVdLmxlbmd0aCA9PT0gMDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBmaXJzdCBzdG9yZWQgY2FsbGJhY2sgZm9yIGEgcGxheWVyIGFuZCBldmVudCBvciBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBtZXRob2Qgb3IgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgY2FsbGJhY2ssIG9yIGZhbHNlIGlmIHRoZXJlIHdlcmUgbm9uZVxuICovXG5cbmZ1bmN0aW9uIHNoaWZ0Q2FsbGJhY2tzKHBsYXllciwgbmFtZSkge1xuICB2YXIgcGxheWVyQ2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKHBsYXllciwgbmFtZSk7XG5cbiAgaWYgKHBsYXllckNhbGxiYWNrcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNhbGxiYWNrID0gcGxheWVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gIHJlbW92ZUNhbGxiYWNrKHBsYXllciwgbmFtZSwgY2FsbGJhY2spO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG4vKipcbiAqIE1vdmUgY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IHRvIGFub3RoZXIgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBvbGRFbGVtZW50IFRoZSBvbGQgZWxlbWVudC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5ld0VsZW1lbnQgVGhlIG5ldyBlbGVtZW50LlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiBzd2FwQ2FsbGJhY2tzKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpIHtcbiAgdmFyIHBsYXllckNhbGxiYWNrcyA9IGNhbGxiYWNrTWFwLmdldChvbGRFbGVtZW50KTtcbiAgY2FsbGJhY2tNYXAuc2V0KG5ld0VsZW1lbnQsIHBsYXllckNhbGxiYWNrcyk7XG4gIGNhbGxiYWNrTWFwLmRlbGV0ZShvbGRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9lbWJlZFxuICovXG52YXIgb0VtYmVkUGFyYW1ldGVycyA9IFsnYXV0b3BhdXNlJywgJ2F1dG9wbGF5JywgJ2JhY2tncm91bmQnLCAnYnlsaW5lJywgJ2NvbG9yJywgJ2NvbnRyb2xzJywgJ2RudCcsICdoZWlnaHQnLCAnaWQnLCAna2V5Ym9hcmQnLCAnbG9vcCcsICdtYXhoZWlnaHQnLCAnbWF4d2lkdGgnLCAnbXV0ZWQnLCAncGxheXNpbmxpbmUnLCAncG9ydHJhaXQnLCAncmVzcG9uc2l2ZScsICdzcGVlZCcsICd0ZXh0dHJhY2snLCAndGl0bGUnLCAndHJhbnNwYXJlbnQnLCAndXJsJywgJ3dpZHRoJ107XG4vKipcbiAqIEdldCB0aGUgJ2RhdGEtdmltZW8nLXByZWZpeGVkIGF0dHJpYnV0ZXMgZnJvbSBhbiBlbGVtZW50IGFzIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50LlxuICogQHBhcmFtIHtPYmplY3R9IFtkZWZhdWx0cz17fV0gVGhlIGRlZmF1bHQgdmFsdWVzIHRvIHVzZS5cbiAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsIHN0cmluZz59XG4gKi9cblxuZnVuY3Rpb24gZ2V0T0VtYmVkUGFyYW1ldGVycyhlbGVtZW50KSB7XG4gIHZhciBkZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHJldHVybiBvRW1iZWRQYXJhbWV0ZXJzLnJlZHVjZShmdW5jdGlvbiAocGFyYW1zLCBwYXJhbSkge1xuICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS12aW1lby1cIi5jb25jYXQocGFyYW0pKTtcblxuICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHBhcmFtc1twYXJhbV0gPSB2YWx1ZSA9PT0gJycgPyAxIDogdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfSwgZGVmYXVsdHMpO1xufVxuLyoqXG4gKiBDcmVhdGUgYW4gZW1iZWQgZnJvbSBvRW1iZWQgZGF0YSBpbnNpZGUgYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgb0VtYmVkIGRhdGEuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHB1dCB0aGUgaWZyYW1lIGluLlxuICogQHJldHVybiB7SFRNTElGcmFtZUVsZW1lbnR9IFRoZSBpZnJhbWUgZW1iZWQuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRW1iZWQoX3JlZiwgZWxlbWVudCkge1xuICB2YXIgaHRtbCA9IF9yZWYuaHRtbDtcblxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbiBlbGVtZW50IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aW1lby1pbml0aWFsaXplZCcpICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG4gIH1cblxuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICBlbGVtZW50LmFwcGVuZENoaWxkKGRpdi5maXJzdENoaWxkKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmltZW8taW5pdGlhbGl6ZWQnLCAndHJ1ZScpO1xuICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcbn1cbi8qKlxuICogTWFrZSBhbiBvRW1iZWQgY2FsbCBmb3IgdGhlIHNwZWNpZmllZCBVUkwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZpZGVvVXJsIFRoZSB2aW1lby5jb20gdXJsIGZvciB0aGUgdmlkZW8uXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gUGFyYW1ldGVycyB0byBwYXNzIHRvIG9FbWJlZC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQuXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5cbmZ1bmN0aW9uIGdldE9FbWJlZERhdGEodmlkZW9VcmwpIHtcbiAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBlbGVtZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgaWYgKCFpc1ZpbWVvVXJsKHZpZGVvVXJsKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCBpcyBub3QgYSB2aW1lby5jb20gdXJsLlwiKSk7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IFwiaHR0cHM6Ly92aW1lby5jb20vYXBpL29lbWJlZC5qc29uP3VybD1cIi5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHZpZGVvVXJsKSk7XG5cbiAgICBmb3IgKHZhciBwYXJhbSBpbiBwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW0pKSB7XG4gICAgICAgIHVybCArPSBcIiZcIi5jb25jYXQocGFyYW0sIFwiPVwiKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1twYXJhbV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgeGhyID0gJ1hEb21haW5SZXF1ZXN0JyBpbiB3aW5kb3cgPyBuZXcgWERvbWFpblJlcXVlc3QoKSA6IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCB3YXMgbm90IGZvdW5kLlwiKSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCBpcyBub3QgZW1iZWRkYWJsZS5cIikpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7IC8vIENoZWNrIGFwaSByZXNwb25zZSBmb3IgNDAzIG9uIG9lbWJlZFxuXG4gICAgICAgIGlmIChqc29uLmRvbWFpbl9zdGF0dXNfY29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgd2FudCB0byBjcmVhdGUgdGhlIGVtYmVkIHRvIGdpdmUgdXNlcnMgdmlzdWFsIGZlZWRiYWNrXG4gICAgICAgICAgY3JlYXRlRW1iZWQoanNvbiwgZWxlbWVudCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCBpcyBub3QgZW1iZWRkYWJsZS5cIikpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKGpzb24pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyA/IFwiIChcIi5jb25jYXQoeGhyLnN0YXR1cywgXCIpXCIpIDogJyc7XG4gICAgICByZWplY3QobmV3IEVycm9yKFwiVGhlcmUgd2FzIGFuIGVycm9yIGZldGNoaW5nIHRoZSBlbWJlZCBjb2RlIGZyb20gVmltZW9cIi5jb25jYXQoc3RhdHVzLCBcIi5cIikpKTtcbiAgICB9O1xuXG4gICAgeGhyLnNlbmQoKTtcbiAgfSk7XG59XG4vKipcbiAqIEluaXRpYWxpemUgYWxsIGVtYmVkcyB3aXRoaW4gYSBzcGVjaWZpYyBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3BhcmVudD1kb2N1bWVudF0gVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiBpbml0aWFsaXplRW1iZWRzKCkge1xuICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBkb2N1bWVudDtcbiAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmltZW8taWRdLCBbZGF0YS12aW1lby11cmxdJykpO1xuXG4gIHZhciBoYW5kbGVFcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKCdjb25zb2xlJyBpbiB3aW5kb3cgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlRoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyBhbiBlbWJlZDogXCIuY29uY2F0KGVycm9yKSk7XG4gICAgfVxuICB9O1xuXG4gIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgLy8gU2tpcCBhbnkgdGhhdCBoYXZlIGRhdGEtdmltZW8tZGVmZXJcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aW1lby1kZWZlcicpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmFtcyA9IGdldE9FbWJlZFBhcmFtZXRlcnMoZWxlbWVudCk7XG4gICAgICB2YXIgdXJsID0gZ2V0VmltZW9VcmwocGFyYW1zKTtcbiAgICAgIGdldE9FbWJlZERhdGEodXJsLCBwYXJhbXMsIGVsZW1lbnQpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVtYmVkKGRhdGEsIGVsZW1lbnQpO1xuICAgICAgfSkuY2F0Y2goaGFuZGxlRXJyb3IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBoYW5kbGVFcnJvcihlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogUmVzaXplIGVtYmVkcyB3aGVuIG1lc3NhZ2VkIGJ5IHRoZSBwbGF5ZXIuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3BhcmVudD1kb2N1bWVudF0gVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiByZXNpemVFbWJlZHMoKSB7XG4gIHZhciBwYXJlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGRvY3VtZW50O1xuXG4gIC8vIFByZXZlbnQgZXhlY3V0aW9uIGlmIHVzZXJzIGluY2x1ZGUgdGhlIHBsYXllci5qcyBzY3JpcHQgbXVsdGlwbGUgdGltZXMuXG4gIGlmICh3aW5kb3cuVmltZW9QbGF5ZXJSZXNpemVFbWJlZHNfKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2luZG93LlZpbWVvUGxheWVyUmVzaXplRW1iZWRzXyA9IHRydWU7XG5cbiAgdmFyIG9uTWVzc2FnZSA9IGZ1bmN0aW9uIG9uTWVzc2FnZShldmVudCkge1xuICAgIGlmICghaXNWaW1lb1VybChldmVudC5vcmlnaW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyAnc3BhY2VjaGFuZ2UnIGlzIGZpcmVkIG9ubHkgb24gZW1iZWRzIHdpdGggY2FyZHNcblxuXG4gICAgaWYgKCFldmVudC5kYXRhIHx8IGV2ZW50LmRhdGEuZXZlbnQgIT09ICdzcGFjZWNoYW5nZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaWZyYW1lcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWZyYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlmcmFtZXNbaV0uY29udGVudFdpbmRvdyAhPT0gZXZlbnQuc291cmNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBDaGFuZ2UgcGFkZGluZy1ib3R0b20gb2YgdGhlIGVuY2xvc2luZyBkaXYgdG8gYWNjb21tb2RhdGVcbiAgICAgIC8vIGNhcmQgY2Fyb3VzZWwgd2l0aG91dCBkaXN0b3J0aW5nIGFzcGVjdCByYXRpb1xuXG5cbiAgICAgIHZhciBzcGFjZSA9IGlmcmFtZXNbaV0ucGFyZW50RWxlbWVudDtcbiAgICAgIHNwYWNlLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIlwiLmNvbmNhdChldmVudC5kYXRhLmRhdGFbMF0uYm90dG9tLCBcInB4XCIpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9wb3N0bWVzc2FnZVxuICovXG4vKipcbiAqIFBhcnNlIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHBvc3RNZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSByZWNlaXZlZCBmcm9tIHBvc3RNZXNzYWdlLlxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlTWVzc2FnZURhdGEoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcGFyc2VkLCB0aHJvdyB0aGUgZXJyb3IgYXMgYSB3YXJuaW5nXG4gICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBQb3N0IGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgb2JqZWN0IHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgVGhlIEFQSSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMgdG8gc2VuZCB0byB0aGUgcGxheWVyLlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiBwb3N0TWVzc2FnZShwbGF5ZXIsIG1ldGhvZCwgcGFyYW1zKSB7XG4gIGlmICghcGxheWVyLmVsZW1lbnQuY29udGVudFdpbmRvdyB8fCAhcGxheWVyLmVsZW1lbnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtZXNzYWdlID0ge1xuICAgIG1ldGhvZDogbWV0aG9kXG4gIH07XG5cbiAgaWYgKHBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVzc2FnZS52YWx1ZSA9IHBhcmFtcztcbiAgfSAvLyBJRSA4IGFuZCA5IGRvIG5vdCBzdXBwb3J0IHBhc3NpbmcgbWVzc2FnZXMsIHNvIHN0cmluZ2lmeSB0aGVtXG5cblxuICB2YXIgaWVWZXJzaW9uID0gcGFyc2VGbG9hdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXi4qbXNpZSAoXFxkKykuKiQvLCAnJDEnKSk7XG5cbiAgaWYgKGllVmVyc2lvbiA+PSA4ICYmIGllVmVyc2lvbiA8IDEwKSB7XG4gICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuICB9XG5cbiAgcGxheWVyLmVsZW1lbnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlLCBwbGF5ZXIub3JpZ2luKTtcbn1cbi8qKlxuICogUGFyc2UgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSBhIG1lc3NhZ2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIHRoYXQgcmVjZWl2ZWQgdGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0geyhPYmplY3R8c3RyaW5nKX0gZGF0YSBUaGUgbWVzc2FnZSBkYXRhLiBTdHJpbmdzIHdpbGwgYmUgcGFyc2VkIGludG8gSlNPTi5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cblxuZnVuY3Rpb24gcHJvY2Vzc0RhdGEocGxheWVyLCBkYXRhKSB7XG4gIGRhdGEgPSBwYXJzZU1lc3NhZ2VEYXRhKGRhdGEpO1xuICB2YXIgY2FsbGJhY2tzID0gW107XG4gIHZhciBwYXJhbTtcblxuICBpZiAoZGF0YS5ldmVudCkge1xuICAgIGlmIChkYXRhLmV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICB2YXIgcHJvbWlzZXMgPSBnZXRDYWxsYmFja3MocGxheWVyLCBkYXRhLmRhdGEubWV0aG9kKTtcbiAgICAgIHByb21pc2VzLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9IGRhdGEuZGF0YS5uYW1lO1xuICAgICAgICBwcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIHJlbW92ZUNhbGxiYWNrKHBsYXllciwgZGF0YS5kYXRhLm1ldGhvZCwgcHJvbWlzZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MocGxheWVyLCBcImV2ZW50OlwiLmNvbmNhdChkYXRhLmV2ZW50KSk7XG4gICAgcGFyYW0gPSBkYXRhLmRhdGE7XG4gIH0gZWxzZSBpZiAoZGF0YS5tZXRob2QpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBzaGlmdENhbGxiYWNrcyhwbGF5ZXIsIGRhdGEubWV0aG9kKTtcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgcGFyYW0gPSBkYXRhLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwocGxheWVyLCBwYXJhbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sucmVzb2x2ZShwYXJhbSk7XG4gICAgfSBjYXRjaCAoZSkgey8vIGVtcHR5XG4gICAgfVxuICB9KTtcbn1cblxuLyogTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSlcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuVGVybXMgKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTY3JlZW5mdWxsKCkge1xuICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbDtcbiAgICB2YXIgZm5NYXAgPSBbWydyZXF1ZXN0RnVsbHNjcmVlbicsICdleGl0RnVsbHNjcmVlbicsICdmdWxsc2NyZWVuRWxlbWVudCcsICdmdWxsc2NyZWVuRW5hYmxlZCcsICdmdWxsc2NyZWVuY2hhbmdlJywgJ2Z1bGxzY3JlZW5lcnJvciddLCAvLyBOZXcgV2ViS2l0XG4gICAgWyd3ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbicsICd3ZWJraXRFeGl0RnVsbHNjcmVlbicsICd3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCcsICd3ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCcsICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvciddLCAvLyBPbGQgV2ViS2l0XG4gICAgWyd3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbicsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCcsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sIFsnbW96UmVxdWVzdEZ1bGxTY3JlZW4nLCAnbW96Q2FuY2VsRnVsbFNjcmVlbicsICdtb3pGdWxsU2NyZWVuRWxlbWVudCcsICdtb3pGdWxsU2NyZWVuRW5hYmxlZCcsICdtb3pmdWxsc2NyZWVuY2hhbmdlJywgJ21vemZ1bGxzY3JlZW5lcnJvciddLCBbJ21zUmVxdWVzdEZ1bGxzY3JlZW4nLCAnbXNFeGl0RnVsbHNjcmVlbicsICdtc0Z1bGxzY3JlZW5FbGVtZW50JywgJ21zRnVsbHNjcmVlbkVuYWJsZWQnLCAnTVNGdWxsc2NyZWVuQ2hhbmdlJywgJ01TRnVsbHNjcmVlbkVycm9yJ11dO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbCA9IGZuTWFwLmxlbmd0aDtcbiAgICB2YXIgcmV0ID0ge307XG5cbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFsID0gZm5NYXBbaV07XG5cbiAgICAgIGlmICh2YWwgJiYgdmFsWzFdIGluIGRvY3VtZW50KSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXRbZm5NYXBbMF1baV1dID0gdmFsW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0oKTtcblxuICB2YXIgZXZlbnROYW1lTWFwID0ge1xuICAgIGZ1bGxzY3JlZW5jaGFuZ2U6IGZuLmZ1bGxzY3JlZW5jaGFuZ2UsXG4gICAgZnVsbHNjcmVlbmVycm9yOiBmbi5mdWxsc2NyZWVuZXJyb3JcbiAgfTtcbiAgdmFyIHNjcmVlbmZ1bGwgPSB7XG4gICAgcmVxdWVzdDogZnVuY3Rpb24gcmVxdWVzdChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgb25GdWxsU2NyZWVuRW50ZXJlZCA9IGZ1bmN0aW9uIG9uRnVsbFNjcmVlbkVudGVyZWQoKSB7XG4gICAgICAgICAgc2NyZWVuZnVsbC5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBvbkZ1bGxTY3JlZW5FbnRlcmVkKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NyZWVuZnVsbC5vbignZnVsbHNjcmVlbmNoYW5nZScsIG9uRnVsbFNjcmVlbkVudGVyZWQpO1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHZhciByZXR1cm5Qcm9taXNlID0gZWxlbWVudFtmbi5yZXF1ZXN0RnVsbHNjcmVlbl0oKTtcblxuICAgICAgICBpZiAocmV0dXJuUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm5Qcm9taXNlLnRoZW4ob25GdWxsU2NyZWVuRW50ZXJlZCkuY2F0Y2gocmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBleGl0OiBmdW5jdGlvbiBleGl0KCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKCFzY3JlZW5mdWxsLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb25GdWxsU2NyZWVuRXhpdCA9IGZ1bmN0aW9uIG9uRnVsbFNjcmVlbkV4aXQoKSB7XG4gICAgICAgICAgc2NyZWVuZnVsbC5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBvbkZ1bGxTY3JlZW5FeGl0KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NyZWVuZnVsbC5vbignZnVsbHNjcmVlbmNoYW5nZScsIG9uRnVsbFNjcmVlbkV4aXQpO1xuICAgICAgICB2YXIgcmV0dXJuUHJvbWlzZSA9IGRvY3VtZW50W2ZuLmV4aXRGdWxsc2NyZWVuXSgpO1xuXG4gICAgICAgIGlmIChyZXR1cm5Qcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVyblByb21pc2UudGhlbihvbkZ1bGxTY3JlZW5FeGl0KS5jYXRjaChyZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiBmdW5jdGlvbiBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVNYXBbZXZlbnRdO1xuXG4gICAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvZmY6IGZ1bmN0aW9uIG9mZihldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVNYXBbZXZlbnRdO1xuXG4gICAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzY3JlZW5mdWxsLCB7XG4gICAgaXNGdWxsc2NyZWVuOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZG9jdW1lbnRbZm4uZnVsbHNjcmVlbkVsZW1lbnRdKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVsZW1lbnQ6IHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50W2ZuLmZ1bGxzY3JlZW5FbGVtZW50XTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzRW5hYmxlZDoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAvLyBDb2VyY2UgdG8gYm9vbGVhbiBpbiBjYXNlIG9mIG9sZCBXZWJLaXRcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZG9jdW1lbnRbZm4uZnVsbHNjcmVlbkVuYWJsZWRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc2NyZWVuZnVsbDtcbn1cblxudmFyIHBsYXllck1hcCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgcmVhZHlNYXAgPSBuZXcgV2Vha01hcCgpO1xudmFyIHNjcmVlbmZ1bGwgPSB7fTtcblxudmFyIFBsYXllciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBQbGF5ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KEhUTUxJRnJhbWVFbGVtZW50fEhUTUxFbGVtZW50fHN0cmluZ3xqUXVlcnkpfSBlbGVtZW50IEEgcmVmZXJlbmNlIHRvIHRoZSBWaW1lb1xuICAgKiAgICAgICAgcGxheWVyIGlmcmFtZSwgYW5kIGlkLCBvciBhIGpRdWVyeSBvYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gb0VtYmVkIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gZW1iZWQgaW4gdGhlIGVsZW1lbnQuXG4gICAqIEByZXR1cm4ge1BsYXllcn1cbiAgICovXG4gIGZ1bmN0aW9uIFBsYXllcihlbGVtZW50KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5ZXIpO1xuXG4gICAgLyogZ2xvYmFsIGpRdWVyeSAqL1xuICAgIGlmICh3aW5kb3cualF1ZXJ5ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCA+IDEgJiYgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQSBqUXVlcnkgb2JqZWN0IHdpdGggbXVsdGlwbGUgZWxlbWVudHMgd2FzIHBhc3NlZCwgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdO1xuICAgIH0gLy8gRmluZCBhbiBlbGVtZW50IGJ5IElEXG5cblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpO1xuICAgIH0gLy8gTm90IGFuIGVsZW1lbnQhXG5cblxuICAgIGlmICghaXNEb21FbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHZhbGlkIGVsZW1lbnQgb3IgYSB2YWxpZCBpZC4nKTtcbiAgICB9IC8vIEFscmVhZHkgaW5pdGlhbGl6ZWQgYW4gZW1iZWQgaW4gdGhpcyBkaXYsIHNvIGdyYWIgdGhlIGlmcmFtZVxuXG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSAhPT0gJ0lGUkFNRScpIHtcbiAgICAgIHZhciBpZnJhbWUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuXG4gICAgICBpZiAoaWZyYW1lKSB7XG4gICAgICAgIGVsZW1lbnQgPSBpZnJhbWU7XG4gICAgICB9XG4gICAgfSAvLyBpZnJhbWUgdXJsIGlzIG5vdCBhIFZpbWVvIHVybFxuXG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0lGUkFNRScgJiYgIWlzVmltZW9VcmwoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGxheWVyIGVsZW1lbnQgcGFzc2VkIGlzbuKAmXQgYSBWaW1lbyBlbWJlZC4nKTtcbiAgICB9IC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBwbGF5ZXIgb2JqZWN0IGluIHRoZSBtYXAsIHJldHVybiB0aGF0XG5cblxuICAgIGlmIChwbGF5ZXJNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gcGxheWVyTWFwLmdldChlbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLl93aW5kb3cgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9yaWdpbiA9ICcqJztcbiAgICB2YXIgcmVhZHlQcm9taXNlID0gbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX29uTWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWlzVmltZW9VcmwoZXZlbnQub3JpZ2luKSB8fCBfdGhpcy5lbGVtZW50LmNvbnRlbnRXaW5kb3cgIT09IGV2ZW50LnNvdXJjZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy5vcmlnaW4gPT09ICcqJykge1xuICAgICAgICAgIF90aGlzLm9yaWdpbiA9IGV2ZW50Lm9yaWdpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhID0gcGFyc2VNZXNzYWdlRGF0YShldmVudC5kYXRhKTtcbiAgICAgICAgdmFyIGlzRXJyb3IgPSBkYXRhICYmIGRhdGEuZXZlbnQgPT09ICdlcnJvcic7XG4gICAgICAgIHZhciBpc1JlYWR5RXJyb3IgPSBpc0Vycm9yICYmIGRhdGEuZGF0YSAmJiBkYXRhLmRhdGEubWV0aG9kID09PSAncmVhZHknO1xuXG4gICAgICAgIGlmIChpc1JlYWR5RXJyb3IpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgIGVycm9yLm5hbWUgPSBkYXRhLmRhdGEubmFtZTtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc1JlYWR5RXZlbnQgPSBkYXRhICYmIGRhdGEuZXZlbnQgPT09ICdyZWFkeSc7XG4gICAgICAgIHZhciBpc1BpbmdSZXNwb25zZSA9IGRhdGEgJiYgZGF0YS5tZXRob2QgPT09ICdwaW5nJztcblxuICAgICAgICBpZiAoaXNSZWFkeUV2ZW50IHx8IGlzUGluZ1Jlc3BvbnNlKSB7XG4gICAgICAgICAgX3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAndHJ1ZScpO1xuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3NEYXRhKF90aGlzLCBkYXRhKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIF90aGlzLl9vbk1lc3NhZ2UpO1xuXG4gICAgICBpZiAoX3RoaXMuZWxlbWVudC5ub2RlTmFtZSAhPT0gJ0lGUkFNRScpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IGdldE9FbWJlZFBhcmFtZXRlcnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIHZhciB1cmwgPSBnZXRWaW1lb1VybChwYXJhbXMpO1xuICAgICAgICBnZXRPRW1iZWREYXRhKHVybCwgcGFyYW1zLCBlbGVtZW50KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgdmFyIGlmcmFtZSA9IGNyZWF0ZUVtYmVkKGRhdGEsIGVsZW1lbnQpOyAvLyBPdmVyd3JpdGUgZWxlbWVudCB3aXRoIHRoZSBuZXcgaWZyYW1lLFxuICAgICAgICAgIC8vIGJ1dCBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGVsZW1lbnRcblxuICAgICAgICAgIF90aGlzLmVsZW1lbnQgPSBpZnJhbWU7XG4gICAgICAgICAgX3RoaXMuX29yaWdpbmFsRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgc3dhcENhbGxiYWNrcyhlbGVtZW50LCBpZnJhbWUpO1xuICAgICAgICAgIHBsYXllck1hcC5zZXQoX3RoaXMuZWxlbWVudCwgX3RoaXMpO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfVxuICAgIH0pOyAvLyBTdG9yZSBhIGNvcHkgb2YgdGhpcyBQbGF5ZXIgaW4gdGhlIG1hcFxuXG4gICAgcmVhZHlNYXAuc2V0KHRoaXMsIHJlYWR5UHJvbWlzZSk7XG4gICAgcGxheWVyTWFwLnNldCh0aGlzLmVsZW1lbnQsIHRoaXMpOyAvLyBTZW5kIGEgcGluZyB0byB0aGUgaWZyYW1lIHNvIHRoZSByZWFkeSBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgaWZcbiAgICAvLyB0aGUgcGxheWVyIGlzIGFscmVhZHkgcmVhZHkuXG5cbiAgICBpZiAodGhpcy5lbGVtZW50Lm5vZGVOYW1lID09PSAnSUZSQU1FJykge1xuICAgICAgcG9zdE1lc3NhZ2UodGhpcywgJ3BpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2NyZWVuZnVsbC5pc0VuYWJsZWQpIHtcbiAgICAgIHZhciBleGl0RnVsbHNjcmVlbiA9IGZ1bmN0aW9uIGV4aXRGdWxsc2NyZWVuKCkge1xuICAgICAgICByZXR1cm4gc2NyZWVuZnVsbC5leGl0KCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmZ1bGxzY3JlZW5jaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2NyZWVuZnVsbC5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICBzdG9yZUNhbGxiYWNrKF90aGlzLCAnZXZlbnQ6ZXhpdEZ1bGxzY3JlZW4nLCBleGl0RnVsbHNjcmVlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlQ2FsbGJhY2soX3RoaXMsICdldmVudDpleGl0RnVsbHNjcmVlbicsIGV4aXRGdWxsc2NyZWVuKTtcbiAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcblxuXG4gICAgICAgIF90aGlzLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcG9zdE1lc3NhZ2UoX3RoaXMsICdmdWxsc2NyZWVuY2hhbmdlJywgc2NyZWVuZnVsbC5pc0Z1bGxzY3JlZW4pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHNjcmVlbmZ1bGwub24oJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLmZ1bGxzY3JlZW5jaGFuZ2VIYW5kbGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogR2V0IGEgcHJvbWlzZSBmb3IgYSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBBUEkgbWV0aG9kIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbYXJncz17fV0gQXJndW1lbnRzIHRvIHNlbmQgdmlhIHBvc3RNZXNzYWdlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhQbGF5ZXIsIFt7XG4gICAga2V5OiBcImNhbGxNZXRob2RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsbE1ldGhvZChuYW1lKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyBucG9fc3JjKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gV2UgYXJlIHN0b3JpbmcgdGhlIHJlc29sdmUvcmVqZWN0IGhhbmRsZXJzIHRvIGNhbGwgbGF0ZXIsIHNvIHdlXG4gICAgICAgIC8vIGNhbuKAmXQgcmV0dXJuIGhlcmUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cbiAgICAgICAgcmV0dXJuIF90aGlzMi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0b3JlQ2FsbGJhY2soX3RoaXMyLCBuYW1lLCB7XG4gICAgICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0OiByZWplY3RcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwb3N0TWVzc2FnZShfdGhpczIsIG5hbWUsIGFyZ3MpO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZiBhIHBsYXllciBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBwcm9wZXJ0eSBuYW1lXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgbnBvX3NyYyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIG5hbWUgPSBnZXRNZXRob2ROYW1lKG5hbWUsICdnZXQnKTsgLy8gV2UgYXJlIHN0b3JpbmcgdGhlIHJlc29sdmUvcmVqZWN0IGhhbmRsZXJzIHRvIGNhbGwgbGF0ZXIsIHNvIHdlXG4gICAgICAgIC8vIGNhbuKAmXQgcmV0dXJuIGhlcmUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cblxuICAgICAgICByZXR1cm4gX3RoaXMzLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcmVDYWxsYmFjayhfdGhpczMsIG5hbWUsIHtcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc3RNZXNzYWdlKF90aGlzMywgbmFtZSk7XG4gICAgICAgIH0pLmNhdGNoKHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgcHJvbWlzZSBmb3Igc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBwbGF5ZXIgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgQVBJIG1ldGhvZCB0byBjYWxsLlxuICAgICAqIEBwYXJhbSB7bWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBuYW1lID0gZ2V0TWV0aG9kTmFtZShuYW1lLCAnc2V0Jyk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGVyZSBtdXN0IGJlIGEgdmFsdWUgdG8gc2V0LicpO1xuICAgICAgICB9IC8vIFdlIGFyZSBzdG9yaW5nIHRoZSByZXNvbHZlL3JlamVjdCBoYW5kbGVycyB0byBjYWxsIGxhdGVyLCBzbyB3ZVxuICAgICAgICAvLyBjYW7igJl0IHJldHVybiBoZXJlLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9hbHdheXMtcmV0dXJuXG5cblxuICAgICAgICByZXR1cm4gX3RoaXM0LnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcmVDYWxsYmFjayhfdGhpczQsIG5hbWUsIHtcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc3RNZXNzYWdlKF90aGlzNCwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBldmVudC4gV2lsbCBjYWxsIHRoZVxuICAgICAqIGNhbGxiYWNrIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLCBgZGF0YWAsIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yXG4gICAgICogdGhhdCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKil9IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGZpcmVzLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIWV2ZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGV2ZW50IG5hbWUuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3ModGhpcywgXCJldmVudDpcIi5jb25jYXQoZXZlbnROYW1lKSk7XG5cbiAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuY2FsbE1ldGhvZCgnYWRkRXZlbnRMaXN0ZW5lcicsIGV2ZW50TmFtZSkuY2F0Y2goZnVuY3Rpb24gKCkgey8vIElnbm9yZSB0aGUgZXJyb3IuIFRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgZXZlbnQgZmlyZWQgdGhhdFxuICAgICAgICAgIC8vIHdpbGwgdHJpZ2dlciB0aGUgZXJyb3IgY2FsbGJhY2sgaWYgdGhleSBhcmUgbGlzdGVuaW5nLlxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc3RvcmVDYWxsYmFjayh0aGlzLCBcImV2ZW50OlwiLmNvbmNhdChldmVudE5hbWUpLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBldmVudC4gV2lsbCByZW1vdmUgYWxsXG4gICAgICogbGlzdGVuZXJzIGZvciB0aGF0IGV2ZW50IGlmIGEgYGNhbGxiYWNrYCBpc27igJl0IHBhc3NlZCwgb3Igb25seSB0aGF0XG4gICAgICogc3BlY2lmaWMgY2FsbGJhY2sgaWYgaXQgaXMgcGFzc2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgc3BlY2lmaWMgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvZmZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gZXZlbnQgbmFtZS4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGFzdENhbGxiYWNrID0gcmVtb3ZlQ2FsbGJhY2sodGhpcywgXCJldmVudDpcIi5jb25jYXQoZXZlbnROYW1lKSwgY2FsbGJhY2spOyAvLyBJZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzIGxlZnQsIHJlbW92ZSB0aGUgbGlzdGVuZXJcblxuICAgICAgaWYgKGxhc3RDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxNZXRob2QoJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBldmVudE5hbWUpLmNhdGNoKGZ1bmN0aW9uIChlKSB7Ly8gSWdub3JlIHRoZSBlcnJvci4gVGhlcmUgd2lsbCBiZSBhbiBlcnJvciBldmVudCBmaXJlZCB0aGF0XG4gICAgICAgICAgLy8gd2lsbCB0cmlnZ2VyIHRoZSBlcnJvciBjYWxsYmFjayBpZiB0aGV5IGFyZSBsaXN0ZW5pbmcuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gbG9hZCBhIG5ldyB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIExvYWRWaWRlb1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgdmlkZW8gd2l0aCB0aGlzIGlkIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4gICAgICogQHJlamVjdCB7VHlwZUVycm9yfSBUaGUgaWQgd2FzIG5vdCBhIG51bWJlci5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBuZXcgdmlkZW8gaW50byB0aGlzIGVtYmVkLiBUaGUgcHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIGlmXG4gICAgICogdGhlIHZpZGVvIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIG9yIGl0IHdpbGwgYmUgcmVqZWN0ZWQgaWYgaXQgY291bGRcbiAgICAgKiBub3QgYmUgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ8b2JqZWN0fSBvcHRpb25zIFRoZSBpZCBvZiB0aGUgdmlkZW8gb3IgYW4gb2JqZWN0IHdpdGggZW1iZWQgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJuIHtMb2FkVmlkZW9Qcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFZpZGVvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRWaWRlbyhvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdsb2FkVmlkZW8nLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHBlcmZvcm0gYW4gYWN0aW9uIHdoZW4gdGhlIFBsYXllciBpcyByZWFkeS5cbiAgICAgKlxuICAgICAqIEB0b2RvIGRvY3VtZW50IGVycm9yc1xuICAgICAqIEBwcm9taXNlIExvYWRWaWRlb1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7dm9pZH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYSBmdW5jdGlvbiB3aGVuIHRoZSBwbGF5ZXIgaWZyYW1lIGhhcyBpbml0aWFsaXplZC4gWW91IGRvIG5vdFxuICAgICAqIG5lZWQgdG8gd2FpdCBmb3IgYHJlYWR5YCB0byB0cmlnZ2VyIHRvIGJlZ2luIGFkZGluZyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBvciBjYWxsaW5nIG90aGVyIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtSZWFkeVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZWFkeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkeSgpIHtcbiAgICAgIHZhciByZWFkeVByb21pc2UgPSByZWFkeU1hcC5nZXQodGhpcykgfHwgbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmtub3duIHBsYXllci4gUHJvYmFibHkgdW5sb2FkZWQuJykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnBvX3NyYy5yZXNvbHZlKHJlYWR5UHJvbWlzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBhZGQgYSBjdWUgcG9pbnQgdG8gdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEFkZEN1ZVBvaW50UHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtzdHJpbmd9IFRoZSBpZCBvZiB0aGUgY3VlIHBvaW50IHRvIHVzZSBmb3IgcmVtb3ZlQ3VlUG9pbnQuXG4gICAgICogQHJlamVjdCB7UmFuZ2VFcnJvcn0gdGhlIHRpbWUgd2FzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGVcbiAgICAgKiAgICAgICAgIHZpZGVv4oCZcyBkdXJhdGlvbi5cbiAgICAgKiBAcmVqZWN0IHtVbnN1cHBvcnRlZEVycm9yfSBDdWUgcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIGN1cnJlbnRcbiAgICAgKiAgICAgICAgIHBsYXllciBvciBicm93c2VyLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQWRkIGEgY3VlIHBvaW50IHRvIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBmb3IgdGhlIGN1ZSBwb2ludC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIEFyYml0cmFyeSBkYXRhIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIGN1ZSBwb2ludC5cbiAgICAgKiBAcmV0dXJuIHtBZGRDdWVQb2ludFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRDdWVQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRDdWVQb2ludCh0aW1lKSB7XG4gICAgICB2YXIgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdhZGRDdWVQb2ludCcsIHtcbiAgICAgICAgdGltZTogdGltZSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byByZW1vdmUgYSBjdWUgcG9pbnQgZnJvbSB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgQWRkQ3VlUG9pbnRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3N0cmluZ30gVGhlIGlkIG9mIHRoZSBjdWUgcG9pbnQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICAgKiBAcmVqZWN0IHtJbnZhbGlkQ3VlUG9pbnR9IFRoZSBjdWUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIHdhcyBub3RcbiAgICAgKiAgICAgICAgIGZvdW5kLlxuICAgICAqIEByZWplY3Qge1Vuc3VwcG9ydGVkRXJyb3J9IEN1ZSBwb2ludHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgcGxheWVyIG9yIGJyb3dzZXIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjdWUgcG9pbnQgZnJvbSB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIGlkIG9mIHRoZSBjdWUgcG9pbnQgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm4ge1JlbW92ZUN1ZVBvaW50UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUN1ZVBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUN1ZVBvaW50KGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdyZW1vdmVDdWVQb2ludCcsIGlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRleHQgdHJhY2sgb24gYSB2aWRlby5cbiAgICAgKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFZpbWVvVGV4dFRyYWNrXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBJU08gbGFuZ3VhZ2UgY29kZS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2luZCBUaGUga2luZCBvZiB0cmFjayBpdCBpcyAoY2FwdGlvbnMgb3Igc3VidGl0bGVzKS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gbGFiZWwgVGhlIGh1bWFu4oCQcmVhZGFibGUgbGFiZWwgZm9yIHRoZSB0cmFjay5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBlbmFibGUgYSB0ZXh0IHRyYWNrLlxuICAgICAqXG4gICAgICogQHByb21pc2UgRW5hYmxlVGV4dFRyYWNrUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtWaW1lb1RleHRUcmFja30gVGhlIHRleHQgdHJhY2sgdGhhdCB3YXMgZW5hYmxlZC5cbiAgICAgKiBAcmVqZWN0IHtJbnZhbGlkVHJhY2tMYW5ndWFnZUVycm9yfSBObyB0cmFjayB3YXMgYXZhaWxhYmxlIHdpdGggdGhlXG4gICAgICogICAgICAgICBzcGVjaWZpZWQgbGFuZ3VhZ2UuXG4gICAgICogQHJlamVjdCB7SW52YWxpZFRyYWNrRXJyb3J9IE5vIHRyYWNrIHdhcyBhdmFpbGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkXG4gICAgICogICAgICAgICBsYW5ndWFnZSBhbmQga2luZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGUgdGV4dCB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UsIGFuZCBvcHRpb25hbGx5IHRoZVxuICAgICAqIHNwZWNpZmllZCBraW5kIChjYXB0aW9ucyBvciBzdWJ0aXRsZXMpLlxuICAgICAqXG4gICAgICogV2hlbiBzZXQgdmlhIHRoZSBBUEksIHRoZSB0cmFjayBsYW5ndWFnZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHZpZXdlcuKAmXNcbiAgICAgKiBzdG9yZWQgcHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgdHdv4oCQbGV0dGVyIGxhbmd1YWdlIGNvZGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtraW5kXSBUaGUga2luZCBvZiB0cmFjayB0byBlbmFibGUgKGNhcHRpb25zIG9yIHN1YnRpdGxlcykuXG4gICAgICogQHJldHVybiB7RW5hYmxlVGV4dFRyYWNrUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZVRleHRUcmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVUZXh0VHJhY2sobGFuZ3VhZ2UsIGtpbmQpIHtcbiAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIGxhbmd1YWdlLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdlbmFibGVUZXh0VHJhY2snLCB7XG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAga2luZDoga2luZFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBkaXNhYmxlIHRoZSBhY3RpdmUgdGV4dCB0cmFjay5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIERpc2FibGVUZXh0VHJhY2tQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3ZvaWR9IFRoZSB0cmFjayB3YXMgZGlzYWJsZWQuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHRoZSBjdXJyZW50bHktYWN0aXZlIHRleHQgdHJhY2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtEaXNhYmxlVGV4dFRyYWNrUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc2FibGVUZXh0VHJhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZVRleHRUcmFjaygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoJ2Rpc2FibGVUZXh0VHJhY2snKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHBhdXNlIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFBhdXNlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHt2b2lkfSBUaGUgdmlkZW8gd2FzIHBhdXNlZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSB2aWRlbyBpZiBpdOKAmXMgcGxheWluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BhdXNlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZCgncGF1c2UnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHBsYXkgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgUGxheVByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7dm9pZH0gVGhlIHZpZGVvIHdhcyBwbGF5ZWQuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSB2aWRlbyBpZiBpdOKAmXMgcGF1c2VkLiAqKk5vdGU6Kiogb24gaU9TIGFuZCBzb21lIG90aGVyXG4gICAgICogbW9iaWxlIGRldmljZXMsIHlvdSBjYW5ub3QgcHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIHBsYXkuIE9uY2UgdGhlXG4gICAgICogdmlld2VyIGhhcyB0YXBwZWQgb24gdGhlIHBsYXkgYnV0dG9uIGluIHRoZSBwbGF5ZXIsIGhvd2V2ZXIsIHlvdVxuICAgICAqIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BsYXlQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZCgncGxheScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBlbnRlcnMgZnVsbHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVxdWVzdEZ1bGxzY3JlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWVzdEZ1bGxzY3JlZW4oKSB7XG4gICAgICBpZiAoc2NyZWVuZnVsbC5pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIHNjcmVlbmZ1bGwucmVxdWVzdCh0aGlzLmVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdyZXF1ZXN0RnVsbHNjcmVlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBleGl0cyBmdWxsc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJleGl0RnVsbHNjcmVlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGl0RnVsbHNjcmVlbigpIHtcbiAgICAgIGlmIChzY3JlZW5mdWxsLmlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gc2NyZWVuZnVsbC5leGl0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoJ2V4aXRGdWxsc2NyZWVuJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBmdWxsc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRGdWxsc2NyZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZ1bGxzY3JlZW4oKSB7XG4gICAgICBpZiAoc2NyZWVuZnVsbC5pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIG5wb19zcmMucmVzb2x2ZShzY3JlZW5mdWxsLmlzRnVsbHNjcmVlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldCgnZnVsbHNjcmVlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBlbnRlcnMgcGljdHVyZS1pbi1waWN0dXJlLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXF1ZXN0UGljdHVyZUluUGljdHVyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoJ3JlcXVlc3RQaWN0dXJlSW5QaWN0dXJlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIGV4aXRzIHBpY3R1cmUtaW4tcGljdHVyZS5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXhpdFBpY3R1cmVJblBpY3R1cmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhpdFBpY3R1cmVJblBpY3R1cmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdleGl0UGljdHVyZUluUGljdHVyZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGljdHVyZS1pbi1waWN0dXJlLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRQaWN0dXJlSW5QaWN0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBpY3R1cmVJblBpY3R1cmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3BpY3R1cmVJblBpY3R1cmUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHVubG9hZCB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBVbmxvYWRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3ZvaWR9IFRoZSB2aWRlbyB3YXMgdW5sb2FkZWQuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHBsYXllciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1VubG9hZFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZCgndW5sb2FkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFudXAgdGhlIHBsYXllciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIERPTVxuICAgICAqXG4gICAgICogSXQgd29uJ3QgYmUgdXNhYmxlIGFuZCBhIG5ldyBvbmUgc2hvdWxkIGJlIGNvbnN0cnVjdGVkXG4gICAgICogIGluIG9yZGVyIHRvIGRvIGFueSBvcGVyYXRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgcmVhZHlNYXAuZGVsZXRlKF90aGlzNSk7XG4gICAgICAgIHBsYXllck1hcC5kZWxldGUoX3RoaXM1LmVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChfdGhpczUuX29yaWdpbmFsRWxlbWVudCkge1xuICAgICAgICAgIHBsYXllck1hcC5kZWxldGUoX3RoaXM1Ll9vcmlnaW5hbEVsZW1lbnQpO1xuXG4gICAgICAgICAgX3RoaXM1Ll9vcmlnaW5hbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXZpbWVvLWluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXM1LmVsZW1lbnQgJiYgX3RoaXM1LmVsZW1lbnQubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIF90aGlzNS5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBJZiB3ZSd2ZSBhZGRlZCBhbiBhZGRpdGlvbmFsIHdyYXBwZXIgZGl2LCByZW1vdmUgdGhhdCBmcm9tIHRoZSBET00uXG4gICAgICAgICAgLy8gSWYgbm90LCBqdXN0IHJlbW92ZSB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICAgICAgaWYgKF90aGlzNS5lbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZSAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAhPT0gX3RoaXM1LmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgX3RoaXM1LmVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzNS5lbGVtZW50LnBhcmVudE5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczUuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzNS5lbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gSWYgdGhlIGNsaXAgaXMgcHJpdmF0ZSB0aGVyZSBpcyBhIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgc3RheXMgdGhlXG4gICAgICAgIC8vIGRpdiBlbGVtZW50LiBEZXN0cm95IHNob3VsZCByZXNldCB0aGUgZGl2IGFuZCByZW1vdmUgdGhlIGlmcmFtZSBjaGlsZC5cblxuXG4gICAgICAgIGlmIChfdGhpczUuZWxlbWVudCAmJiBfdGhpczUuZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0RJVicgJiYgX3RoaXM1LmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIF90aGlzNS5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS12aW1lby1pbml0aWFsaXplZCcpO1xuXG4gICAgICAgICAgdmFyIGlmcmFtZSA9IF90aGlzNS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgaWYgKGlmcmFtZSAmJiBpZnJhbWUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgLy8gSWYgd2UndmUgYWRkZWQgYW4gYWRkaXRpb25hbCB3cmFwcGVyIGRpdiwgcmVtb3ZlIHRoYXQgZnJvbSB0aGUgRE9NLlxuICAgICAgICAgICAgLy8gSWYgbm90LCBqdXN0IHJlbW92ZSB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICAgICAgICBpZiAoaWZyYW1lLnBhcmVudE5vZGUucGFyZW50Tm9kZSAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAhPT0gaWZyYW1lLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgaWZyYW1lLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpZnJhbWUucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNS5fd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBfdGhpczUuX29uTWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKHNjcmVlbmZ1bGwuaXNFbmFibGVkKSB7XG4gICAgICAgICAgc2NyZWVuZnVsbC5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBfdGhpczUuZnVsbHNjcmVlbmNoYW5nZUhhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGF1dG9wYXVzZSBiZWhhdmlvciBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRBdXRvcGF1c2VQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge2Jvb2xlYW59IFdoZXRoZXIgYXV0b3BhdXNlIGlzIHR1cm5lZCBvbiBvciBvZmYuXG4gICAgICogQHJlamVjdCB7VW5zdXBwb3J0ZWRFcnJvcn0gQXV0b3BhdXNlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgcGxheWVyIG9yIGJyb3dzZXIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGF1dG9wYXVzZSBiZWhhdmlvciBmb3IgdGhpcyBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRBdXRvcGF1c2VQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXV0b3BhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF1dG9wYXVzZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnYXV0b3BhdXNlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGF1dG9wYXVzZSBiZWhhdmlvciBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRBdXRvcGF1c2VQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge2Jvb2xlYW59IFdoZXRoZXIgYXV0b3BhdXNlIGlzIHR1cm5lZCBvbiBvciBvZmYuXG4gICAgICogQHJlamVjdCB7VW5zdXBwb3J0ZWRFcnJvcn0gQXV0b3BhdXNlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgcGxheWVyIG9yIGJyb3dzZXIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b3BhdXNlIGJlaGF2aW9yIG9mIHRoaXMgcGxheWVyLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgd2hlbiBhbm90aGVyIHZpZGVvIGlzIHBsYXllZCBpbiB0aGUgc2FtZSBicm93c2VyLCB0aGlzXG4gICAgICogcGxheWVyIHdpbGwgYXV0b21hdGljYWxseSBwYXVzZS4gVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgcmVhc29uXG4gICAgICogZm9yIGRvaW5nIHNvLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgbGVhdmUgYXV0b3BhdXNlIHNldCB0byB0aGVcbiAgICAgKiBkZWZhdWx0IChgdHJ1ZWApLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvcGF1c2VcbiAgICAgKiBAcmV0dXJuIHtTZXRBdXRvcGF1c2VQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0QXV0b3BhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEF1dG9wYXVzZShhdXRvcGF1c2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldCgnYXV0b3BhdXNlJywgYXV0b3BhdXNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgYnVmZmVyZWQgcHJvcGVydHkgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0QnVmZmVyZWRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0FycmF5fSBCdWZmZXJlZCBUaW1lcmFuZ2VzIGNvbnZlcnRlZCB0byBhbiBBcnJheS5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnVmZmVyZWQgcHJvcGVydHkgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0QnVmZmVyZWRQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QnVmZmVyZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnVmZmVyZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2J1ZmZlcmVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IENhbWVyYVByb3BlcnRpZXNcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBwcm9wcy55YXcgLSBOdW1iZXIgYmV0d2VlbiAwIGFuZCAzNjAuXG4gICAgICogQHByb3Age251bWJlcn0gcHJvcHMucGl0Y2ggLSBOdW1iZXIgYmV0d2VlbiAtOTAgYW5kIDkwLlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHByb3BzLnJvbGwgLSBOdW1iZXIgYmV0d2VlbiAtMTgwIGFuZCAxODAuXG4gICAgICogQHByb3Age251bWJlcn0gcHJvcHMuZm92IC0gVGhlIGZpZWxkIG9mIHZpZXcgaW4gZGVncmVlcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGNhbWVyYSBwcm9wZXJ0aWVzIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRDYW1lcmFQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0NhbWVyYVByb3BlcnRpZXN9IFRoZSBjYW1lcmEgcHJvcGVydGllcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEZvciAzNjDCsCB2aWRlb3MgZ2V0IHRoZSBjYW1lcmEgcHJvcGVydGllcyBmb3IgdGhpcyBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRDYW1lcmFQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FtZXJhUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FtZXJhUHJvcHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NhbWVyYVByb3BzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGNhbWVyYSBwcm9wZXJ0aWVzIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRDYW1lcmFQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge09iamVjdH0gVGhlIGNhbWVyYSB3YXMgc3VjY2Vzc2Z1bGx5IHNldC5cbiAgICAgKiBAcmVqZWN0IHtSYW5nZUVycm9yfSBUaGUgcmFuZ2Ugd2FzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBGb3IgMzYwwrAgdmlkZW9zIHNldCB0aGUgY2FtZXJhIHByb3BlcnRpZXMgZm9yIHRoaXMgcGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDYW1lcmFQcm9wZXJ0aWVzfSBjYW1lcmEgVGhlIGNhbWVyYSBwcm9wZXJ0aWVzXG4gICAgICogQHJldHVybiB7U2V0Q2FtZXJhUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldENhbWVyYVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENhbWVyYVByb3BzKGNhbWVyYSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KCdjYW1lcmFQcm9wcycsIGNhbWVyYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBjaGFwdGVyLlxuICAgICAqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gVmltZW9DaGFwdGVyXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHN0YXJ0VGltZSBUaGUgc3RhcnQgdGltZSBvZiB0aGUgY2hhcHRlci5cbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBjaGFwdGVyLlxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmRleCBUaGUgcGxhY2UgaW4gdGhlIG9yZGVyIG9mIENoYXB0ZXJzLiBTdGFydHMgYXQgMS5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgY2hhcHRlcnMgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldENoYXB0ZXJzUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtWaW1lb0NoYXB0ZXJbXX0gVGhlIGNoYXB0ZXJzIGZvciB0aGUgdmlkZW8uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSBjaGFwdGVycyBmb3IgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0Q2hhcHRlcnNQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2hhcHRlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2hhcHRlcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NoYXB0ZXJzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhcHRlci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldEN1cnJlbnRDaGFwdGVyc1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7VmltZW9DaGFwdGVyfHVuZGVmaW5lZH0gVGhlIGN1cnJlbnQgY2hhcHRlciBmb3IgdGhlIHZpZGVvLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNoYXB0ZXIgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldEN1cnJlbnRDaGFwdGVyc1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50Q2hhcHRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50Q2hhcHRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnY3VycmVudENoYXB0ZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgY29sb3Igb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldENvbG9yUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtzdHJpbmd9IFRoZSBoZXggY29sb3Igb2YgdGhlIHBsYXllci5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29sb3IgZm9yIHRoaXMgcGxheWVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0Q29sb3JQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q29sb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29sb3IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGNvbG9yIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRDb2xvclByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7c3RyaW5nfSBUaGUgY29sb3Igd2FzIHN1Y2Nlc3NmdWxseSBzZXQuXG4gICAgICogQHJlamVjdCB7VHlwZUVycm9yfSBUaGUgc3RyaW5nIHdhcyBub3QgYSB2YWxpZCBoZXggb3IgcmdiIGNvbG9yLlxuICAgICAqIEByZWplY3Qge0NvbnRyYXN0RXJyb3J9IFRoZSBjb2xvciB3YXMgc2V0LCBidXQgdGhlIGNvbnRyYXN0IGlzXG4gICAgICogICAgICAgICBvdXRzaWRlIG9mIHRoZSBhY2NlcHRhYmxlIHJhbmdlLlxuICAgICAqIEByZWplY3Qge0VtYmVkU2V0dGluZ3NFcnJvcn0gVGhlIG93bmVyIG9mIHRoZSBwbGF5ZXIgaGFzIGNob3NlbiB0b1xuICAgICAqICAgICAgICAgdXNlIGEgc3BlY2lmaWMgY29sb3IuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNvbG9yIG9mIHRoaXMgcGxheWVyIHRvIGEgaGV4IG9yIHJnYiBzdHJpbmcuIFNldHRpbmcgdGhlXG4gICAgICogY29sb3IgbWF5IGZhaWwgaWYgdGhlIG93bmVyIG9mIHRoZSB2aWRlbyBoYXMgc2V0IHRoZWlyIGVtYmVkXG4gICAgICogcHJlZmVyZW5jZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBjb2xvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciBUaGUgaGV4IG9yIHJnYiBjb2xvciBzdHJpbmcgdG8gc2V0LlxuICAgICAqIEByZXR1cm4ge1NldENvbG9yUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldENvbG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbG9yKGNvbG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ2NvbG9yJywgY29sb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgY3VlIHBvaW50LlxuICAgICAqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gVmltZW9DdWVQb2ludFxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIG9mIHRoZSBjdWUgcG9pbnQuXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IGRhdGEgVGhlIGRhdGEgcGFzc2VkIHdoZW4gYWRkaW5nIHRoZSBjdWUgcG9pbnQuXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSB1bmlxdWUgaWQgZm9yIHVzZSB3aXRoIHJlbW92ZUN1ZVBvaW50LlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgY3VlIHBvaW50cyBvZiBhIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0Q3VlUG9pbnRzUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtWaW1lb0N1ZVBvaW50W119IFRoZSBjdWUgcG9pbnRzIGFkZGVkIHRvIHRoZSB2aWRlby5cbiAgICAgKiBAcmVqZWN0IHtVbnN1cHBvcnRlZEVycm9yfSBDdWUgcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIGN1cnJlbnRcbiAgICAgKiAgICAgICAgIHBsYXllciBvciBicm93c2VyLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBjdWUgcG9pbnRzIGFkZGVkIHRvIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldEN1ZVBvaW50c1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdWVQb2ludHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VlUG9pbnRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdjdWVQb2ludHMnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldEN1cnJlbnRUaW1lUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0Q3VycmVudFRpbWVQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2N1cnJlbnRUaW1lJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRDdXJyZW50VGltZVByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgYWN0dWFsIGN1cnJlbnQgdGltZSB0aGF0IHdhcyBzZXQuXG4gICAgICogQHJlamVjdCB7UmFuZ2VFcnJvcn0gdGhlIHRpbWUgd2FzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGVcbiAgICAgKiAgICAgICAgIHZpZGVv4oCZcyBkdXJhdGlvbi5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBzZWNvbmRzLiBJZiB0aGUgcGxheWVyIHdhc1xuICAgICAqIHBhdXNlZCwgaXQgd2lsbCByZW1haW4gcGF1c2VkLiBMaWtld2lzZSwgaWYgdGhlIHBsYXllciB3YXMgcGxheWluZyxcbiAgICAgKiBpdCB3aWxsIHJlc3VtZSBwbGF5aW5nIG9uY2UgdGhlIHZpZGVvIGhhcyBidWZmZXJlZC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcHJvdmlkZSBhbiBhY2N1cmF0ZSB0aW1lIGFuZCB0aGUgcGxheWVyIHdpbGwgYXR0ZW1wdCB0byBzZWVrXG4gICAgICogdG8gYXMgY2xvc2UgdG8gdGhhdCB0aW1lIGFzIHBvc3NpYmxlLiBUaGUgZXhhY3QgdGltZSB3aWxsIGJlIHRoZVxuICAgICAqIGZ1bGZpbGxlZCB2YWx1ZSBvZiB0aGUgcHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50VGltZVxuICAgICAqIEByZXR1cm4ge1NldEN1cnJlbnRUaW1lUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEN1cnJlbnRUaW1lKGN1cnJlbnRUaW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ2N1cnJlbnRUaW1lJywgY3VycmVudFRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXREdXJhdGlvblByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIHZpZGVvIGluIHNlY29uZHMuIEl0IHdpbGwgYmUgcm91bmRlZCB0byB0aGVcbiAgICAgKiBuZWFyZXN0IHNlY29uZCBiZWZvcmUgcGxheWJhY2sgYmVnaW5zLCBhbmQgdG8gdGhlIG5lYXJlc3QgdGhvdXNhbmR0aFxuICAgICAqIG9mIGEgc2Vjb25kIGFmdGVyIHBsYXliYWNrIGJlZ2lucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldER1cmF0aW9uUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdkdXJhdGlvbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBlbmRlZCBzdGF0ZSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRFbmRlZFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHZpZGVvIGhhcyBlbmRlZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZW5kZWQgc3RhdGUgb2YgdGhlIHZpZGVvLiBUaGUgdmlkZW8gaGFzIGVuZGVkIGlmXG4gICAgICogYGN1cnJlbnRUaW1lID09PSBkdXJhdGlvbmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRFbmRlZFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRFbmRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFbmRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnZW5kZWQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgbG9vcCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0TG9vcFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBzZXQgdG8gbG9vcC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbG9vcCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0TG9vcFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb29wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvb3AoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2xvb3AnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgbG9vcCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgU2V0TG9vcFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gVGhlIGxvb3Agc3RhdGUgdGhhdCB3YXMgc2V0LlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsb29wIHN0YXRlIG9mIHRoZSBwbGF5ZXIuIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIHBsYXllclxuICAgICAqIHdpbGwgc3RhcnQgb3ZlciBpbW1lZGlhdGVseSBvbmNlIHBsYXliYWNrIGVuZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvb3BcbiAgICAgKiBAcmV0dXJuIHtTZXRMb29wUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9vcChsb29wKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ2xvb3AnLCBsb29wKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgbXV0ZWQgc3RhdGUgb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFNldE11dGVkUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtib29sZWFufSBUaGUgbXV0ZWQgc3RhdGUgdGhhdCB3YXMgc2V0LlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtdXRlZCBzdGF0ZSBvZiB0aGUgcGxheWVyLiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBwbGF5ZXJcbiAgICAgKiB2b2x1bWUgd2lsbCBiZSBtdXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXV0ZWRcbiAgICAgKiBAcmV0dXJuIHtTZXRNdXRlZFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRNdXRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNdXRlZChtdXRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KCdtdXRlZCcsIG11dGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgbXV0ZWQgc3RhdGUgb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldE11dGVkUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIG11dGVkLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtdXRlZCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0TXV0ZWRQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TXV0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TXV0ZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ211dGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHBhdXNlZCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0TG9vcFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHZpZGVvIGlzIHBhdXNlZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGF1c2VkIHN0YXRlIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRMb29wUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFBhdXNlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYXVzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3BhdXNlZCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRQbGF5YmFja1JhdGVQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gMC41IHRvIDIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gYDAuNWAgdG8gYDJgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0UGxheWJhY2tSYXRlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFBsYXliYWNrUmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQbGF5YmFja1JhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3BsYXliYWNrUmF0ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gc2V0IHRoZSBwbGF5YmFja3JhdGUgb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFNldFBsYXliYWNrUmF0ZVByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgcGxheWJhY2sgcmF0ZSB3YXMgc2V0LlxuICAgICAqIEByZWplY3Qge1JhbmdlRXJyb3J9IFRoZSBwbGF5YmFjayByYXRlIHdhcyBsZXNzIHRoYW4gMC41IG9yIGdyZWF0ZXIgdGhhbiAyLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIHRoZSBwbGF5ZXIgb24gYSBzY2FsZSBmcm9tIGAwLjVgIHRvIGAyYC4gV2hlbiBzZXRcbiAgICAgKiB2aWEgdGhlIEFQSSwgdGhlIHBsYXliYWNrIHJhdGUgd2lsbCBub3QgYmUgc3luY2hyb25pemVkIHRvIG90aGVyXG4gICAgICogcGxheWVycyBvciBzdG9yZWQgYXMgdGhlIHZpZXdlcidzIHByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGxheWJhY2tSYXRlXG4gICAgICogQHJldHVybiB7U2V0UGxheWJhY2tSYXRlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFBsYXliYWNrUmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ3BsYXliYWNrUmF0ZScsIHBsYXliYWNrUmF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHBsYXllZCBwcm9wZXJ0eSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRQbGF5ZWRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0FycmF5fSBQbGF5ZWQgVGltZXJhbmdlcyBjb252ZXJ0ZWQgdG8gYW4gQXJyYXkuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBsYXllZCBwcm9wZXJ0eSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRQbGF5ZWRQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UGxheWVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBsYXllZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgncGxheWVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHF1YWxpdGllcyBhdmFpbGFibGUgb2YgdGhlIGN1cnJlbnQgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRRdWFsaXRpZXNQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0FycmF5fSBUaGUgcXVhbGl0aWVzIG9mIHRoZSB2aWRlby5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcXVhbGl0aWVzIG9mIHRoZSBjdXJyZW50IHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0UXVhbGl0aWVzUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFF1YWxpdGllc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRRdWFsaXRpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3F1YWxpdGllcycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBjdXJyZW50IHNldCBxdWFsaXR5IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFF1YWxpdHlQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3N0cmluZ30gVGhlIGN1cnJlbnQgc2V0IHF1YWxpdHkuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc2V0IHF1YWxpdHkgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0UXVhbGl0eVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRRdWFsaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFF1YWxpdHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3F1YWxpdHknKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgdmlkZW8gcXVhbGl0eS5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFNldFF1YWxpdHlQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHF1YWxpdHkgd2FzIHNldC5cbiAgICAgKiBAcmVqZWN0IHtSYW5nZUVycm9yfSBUaGUgcXVhbGl0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IGEgdmlkZW8gcXVhbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaXR5XG4gICAgICogQHJldHVybiB7U2V0UXVhbGl0eVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRRdWFsaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFF1YWxpdHkocXVhbGl0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KCdxdWFsaXR5JywgcXVhbGl0eSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHNlZWthYmxlIHByb3BlcnR5IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFNlZWthYmxlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtBcnJheX0gU2Vla2FibGUgVGltZXJhbmdlcyBjb252ZXJ0ZWQgdG8gYW4gQXJyYXkuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlZWthYmxlIHByb3BlcnR5IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFNlZWthYmxlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFNlZWthYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlZWthYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdzZWVrYWJsZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBzZWVraW5nIHByb3BlcnR5IG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRTZWVraW5nUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBzZWVraW5nLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IGlmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHNlZWtpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRTZWVraW5nUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFNlZWtpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vla2luZygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnc2Vla2luZycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSB0ZXh0IHRyYWNrcyBvZiBhIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0VGV4dFRyYWNrc1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7VmltZW9UZXh0VHJhY2tbXX0gVGhlIHRleHQgdHJhY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlkZW8uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHRleHQgdHJhY2tzIHRoYXQgZXhpc3QgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFRleHRUcmFja3NQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGV4dFRyYWNrc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUZXh0VHJhY2tzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd0ZXh0VHJhY2tzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGVtYmVkIGNvZGUgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFZpZGVvRW1iZWRDb2RlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtzdHJpbmd9IFRoZSBgPGlmcmFtZT5gIGVtYmVkIGNvZGUgZm9yIHRoZSB2aWRlby5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYDxpZnJhbWU+YCBlbWJlZCBjb2RlIGZvciB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb0VtYmVkQ29kZVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRWaWRlb0VtYmVkQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWRlb0VtYmVkQ29kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9FbWJlZENvZGUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgaWQgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0VmlkZW9JZFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgaWQgb2YgdGhlIHZpZGVvLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpZCBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb0lkUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFZpZGVvSWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmlkZW9JZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9JZCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSB0aXRsZSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRWaWRlb1RpdGxlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSB0aXRsZSBvZiB0aGUgdmlkZW8uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFZpZGVvVGl0bGVQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmlkZW9UaXRsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWRlb1RpdGxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd2aWRlb1RpdGxlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIG5hdGl2ZSB3aWR0aCBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRWaWRlb1dpZHRoUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSBuYXRpdmUgd2lkdGggb2YgdGhlIHZpZGVvLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuYXRpdmUgd2lkdGggb2YgdGhlIGN1cnJlbnRseeKAkHBsYXlpbmcgdmlkZW8uIFRoZSB3aWR0aCBvZlxuICAgICAqIHRoZSBoaWdoZXN04oCQcmVzb2x1dGlvbiBhdmFpbGFibGUgd2lsbCBiZSB1c2VkIGJlZm9yZSBwbGF5YmFjayBiZWdpbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb1dpZHRoUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFZpZGVvV2lkdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmlkZW9XaWR0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9XaWR0aCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBuYXRpdmUgaGVpZ2h0IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFZpZGVvSGVpZ2h0UHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSBuYXRpdmUgaGVpZ2h0IG9mIHRoZSB2aWRlby5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmF0aXZlIGhlaWdodCBvZiB0aGUgY3VycmVudGx54oCQcGxheWluZyB2aWRlby4gVGhlIGhlaWdodCBvZlxuICAgICAqIHRoZSBoaWdoZXN04oCQcmVzb2x1dGlvbiBhdmFpbGFibGUgd2lsbCBiZSB1c2VkIGJlZm9yZSBwbGF5YmFjayBiZWdpbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb0hlaWdodFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRWaWRlb0hlaWdodFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWRlb0hlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9IZWlnaHQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgdmltZW8uY29tIHVybCBmb3IgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0VmlkZW9VcmxQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHZpbWVvLmNvbSB1cmwgZm9yIHRoZSB2aWRlby5cbiAgICAgKiBAcmVqZWN0IHtQcml2YWN5RXJyb3J9IFRoZSB1cmwgaXNu4oCZdCBhdmFpbGFibGUgYmVjYXVzZSBvZiB0aGUgdmlkZW/igJlzIHByaXZhY3kgc2V0dGluZy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmltZW8uY29tIHVybCBmb3IgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0VmlkZW9VcmxQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmlkZW9VcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmlkZW9VcmwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3ZpZGVvVXJsJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHZvbHVtZSBsZXZlbCBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0Vm9sdW1lUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSB2b2x1bWUgbGV2ZWwgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gMCB0byAxLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHZvbHVtZSBsZXZlbCBvZiB0aGUgcGxheWVyIG9uIGEgc2NhbGUgZnJvbSBgMGAgdG8gYDFgLlxuICAgICAqXG4gICAgICogTW9zdCBtb2JpbGUgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBhbiBpbmRlcGVuZGVudCB2b2x1bWUgZnJvbSB0aGVcbiAgICAgKiBzeXN0ZW0gdm9sdW1lLiBJbiB0aG9zZSBjYXNlcywgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGAxYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFZvbHVtZVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vm9sdW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd2b2x1bWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgdm9sdW1lIGxldmVsIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRWb2x1bWVQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHZvbHVtZSB3YXMgc2V0LlxuICAgICAqIEByZWplY3Qge1JhbmdlRXJyb3J9IFRoZSB2b2x1bWUgd2FzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiAxLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2b2x1bWUgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gYDBgIHRvIGAxYC4gV2hlbiBzZXRcbiAgICAgKiB2aWEgdGhlIEFQSSwgdGhlIHZvbHVtZSBsZXZlbCB3aWxsIG5vdCBiZSBzeW5jaHJvbml6ZWQgdG8gb3RoZXJcbiAgICAgKiBwbGF5ZXJzIG9yIHN0b3JlZCBhcyB0aGUgdmlld2Vy4oCZcyBwcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogTW9zdCBtb2JpbGUgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSB2b2x1bWUuIEFuIGVycm9yIHdpbGxcbiAgICAgKiAqbm90KiBiZSB0cmlnZ2VyZWQgaW4gdGhhdCBzaXR1YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdm9sdW1lXG4gICAgICogQHJldHVybiB7U2V0Vm9sdW1lUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFZvbHVtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWb2x1bWUodm9sdW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ3ZvbHVtZScsIHZvbHVtZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBsYXllcjtcbn0oKTsgLy8gU2V0dXAgZW1iZWQgb25seSBpZiB0aGlzIGlzIG5vdCBhIG5vZGUgZW52aXJvbm1lbnRcblxuXG5pZiAoIWlzTm9kZSkge1xuICBzY3JlZW5mdWxsID0gaW5pdGlhbGl6ZVNjcmVlbmZ1bGwoKTtcbiAgaW5pdGlhbGl6ZUVtYmVkcygpO1xuICByZXNpemVFbWJlZHMoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxheWVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vimeo/player/dist/player.es.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/FacetedFilters.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/components/FacetedFilters.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FacetedFilters)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n\n\nclass FacetedFilters {\n constructor(section) {\n this.el = section.el;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n this.filterInputs = null;\n this.dropdowns = this.el.querySelectorAll('[data-filter-group]');\n this.summaryEls = this.el.querySelectorAll('[data-filter-group-summary]');\n this.filterContents = this.el.querySelectorAll('[data-filter-group-content]');\n this.closedState = 'closed';\n this.openState = 'open';\n this.disclosureAnimations = {};\n this.filterRange = this.el.querySelectorAll('[data-filter-range]');\n this.rangeNames = [];\n this.filterRange.forEach(el => {\n this.rangeNames.push(el.name);\n });\n this.updateTimeout = null;\n this.initFilterEvents = this.initFilterEvents.bind(this);\n this.updatePrice = this.updatePrice.bind(this);\n this.buildFilterQuery = this.buildFilterQuery.bind(this);\n this.initAnimations();\n this.initFilterEvents();\n }\n\n initFilterEvents() {\n /* For radio buttons */\n this.filterInputs = this.el.querySelectorAll('[data-filter-input]');\n this.filterInputs.forEach(filter => {\n this.events.register(filter, 'click', e => {\n const target = e.currentTarget;\n\n if (target.dataset.hasOwnProperty('disabled')) {\n e.preventDefault();\n return;\n }\n\n this._filterClick(target);\n });\n });\n this.filterContents.forEach(content => {\n this.events.register(window, 'resize', () => this._setStyleVariables(content));\n });\n this.events.register(window, 'keyup', e => {\n if (e.key === 'Escape') {\n this.closeAllDropdowns();\n }\n });\n /* For range input */\n\n this.filterRange.forEach(filter => {\n this.events.register(filter, 'change', e => this.updatePrice(e.currentTarget));\n this.events.register(filter, 'keyup', e => {\n if (e.key !== 'Tab') {\n this.updatePrice(e.currentTarget);\n }\n });\n });\n this.summaryEls.forEach(summary => {\n this.events.register(summary, 'click', event => {\n this.animateDisclosure(event);\n });\n });\n /* When clicking outside dropdown element, close dropdown */\n\n this.events.register(document.body, 'click', e => {\n if (!e.target.closest('[data-filter-group]')) {\n this.closeAllDropdowns();\n }\n });\n }\n\n _filterClick(target) {\n const checkbox = target.querySelector('[data-filter-checkbox]');\n\n if (target.hasAttribute('data-filter-active')) {\n if (checkbox) {\n checkbox.removeAttribute('data-checked');\n }\n\n target.removeAttribute('data-filter-active');\n } else {\n if (checkbox) {\n checkbox.setAttribute('data-checked', '');\n }\n\n target.setAttribute('data-filter-active', '');\n }\n }\n /*\n * Initialize animations on checkbox container\n * using filter tag as JSON key\n */\n\n\n initAnimations() {\n this.summaryEls.forEach(summary => {\n const filterList = summary.nextElementSibling;\n const currentDetailsEl = summary.closest('[data-filter-group]');\n const index = summary.dataset.filterGroupIndex;\n this.disclosureAnimations[index] = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_0__.transition)({\n el: filterList,\n state: this.closedState\n });\n currentDetailsEl.style.setProperty('--closed-height', `${summary.offsetHeight}px`);\n });\n }\n\n buildFilterQuery(element) {\n let searchParameters; // If input is price range, the url_to_add property is not available, so we\n // need to build the query manually\n\n if (element.classList.contains('filter-range-input')) {\n const currentSearch = window.location.search.replace('?', '');\n const formData = new FormData(element.closest('form'));\n const newSearch = new URLSearchParams(formData).toString(); // Filter through current search string to see if price range input already exists,\n // if it does, create new string without current price range parameters\n\n const splitCurrentSearch = currentSearch.split('&');\n let filteredCurrentSearch = splitCurrentSearch.filter(search => {\n if (search.includes(this.rangeNames[0]) || search.includes(this.rangeNames[1])) {\n return false;\n }\n\n return true;\n });\n filteredCurrentSearch = filteredCurrentSearch.join('&'); // If current search parameters exist, append new search parameters\n // on to existing parameters\n\n if (filteredCurrentSearch.length > 0) {\n searchParameters = `${filteredCurrentSearch}&${newSearch}`;\n } else {\n searchParameters = `${newSearch}`;\n }\n }\n\n let urlQueryString = '';\n urlQueryString = `?${searchParameters}`;\n return urlQueryString;\n }\n\n updatePrice(element) {\n // cancel any pending requests\n if (this.updateTimeout !== null) {\n clearTimeout(this.updateTimeout);\n } // Wait for user to finish entering input before reloading page\n\n\n this.updateTimeout = setTimeout(() => {\n this.getFilteredResults(element);\n }, 2000);\n }\n\n getFilteredResults(element) {\n const filterQuery = this.buildFilterQuery(element);\n window.location.search = filterQuery;\n }\n\n animateDisclosure(event) {\n event.preventDefault();\n const summary = event.currentTarget;\n const filterList = summary.nextElementSibling;\n const currentDetailsEl = summary.closest('[data-filter-group]');\n /* Handle dropdowns on click event outside disclosure */\n\n if (filterList == null) {\n this.closeAllDropdowns();\n } else {\n if (filterList.dataset.animation) return;\n\n if (filterList.dataset.animationState === this.openState) {\n this.closeDisclosure(currentDetailsEl);\n } else {\n /* Close any open dropdowns before opening new dropdown */\n this.closeAllDropdowns();\n this.openDisclosure(currentDetailsEl);\n }\n }\n }\n\n _setStyleVariables(el) {\n // On desktop, we should check if the dropdown overflows the\n // viewport, and add a class if it does so we can align it\n // relative to the summary element accordingly\n const {\n right: rightBounds,\n left: leftBounds\n } = el.getBoundingClientRect();\n\n if (rightBounds >= window.innerWidth) {\n el.classList.add('filters--overflow-right');\n }\n\n if (leftBounds <= 0) {\n el.classList.add('filters--overflow-left');\n } // We need to absolutely position the open disclosure to center it on mobile\n // and make it full screen, so we set some CSS variables to do that\n\n\n const wrapper = el.closest('.faceted-filters');\n const {\n width: mobileWidth,\n left: mobileLeft\n } = wrapper.getBoundingClientRect();\n el.style.setProperty('--mobile-width', `${mobileWidth}px`);\n el.style.setProperty('--mobile-left', `${mobileLeft}px`);\n el.style.setProperty('--open-height', `${el.offsetHeight}px`);\n }\n\n openDisclosure(detailsEl) {\n const index = detailsEl.querySelector('[data-filter-group-summary]').dataset.filterGroupIndex;\n detailsEl.setAttribute('open', '');\n this.disclosureAnimations[index].animateTo(this.openState, {\n onStart: ({\n el\n }) => {\n this._setStyleVariables(el);\n }\n });\n detailsEl.classList.add('dropdown-expanded');\n }\n\n closeDisclosure(detailsEl) {\n const index = detailsEl.querySelector('[data-filter-group-summary]').dataset.filterGroupIndex;\n this.disclosureAnimations[index].animateTo(this.closedState).then(() => {\n detailsEl.removeAttribute('open');\n });\n detailsEl.classList.remove('dropdown-expanded');\n }\n\n closeAllDropdowns() {\n this.dropdowns.forEach(dropdown => {\n if (dropdown.classList.contains('dropdown-expanded')) {\n this.closeDisclosure(dropdown);\n }\n });\n }\n\n unload() {\n if (this.events) {\n this.events.unregisterAll();\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0ZhY2V0ZWRGaWx0ZXJzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvRmFjZXRlZEZpbHRlcnMuanM/M2MwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnQHBpeGVsdW5pb24vYW5pbWF0aW9ucyc7XG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhY2V0ZWRGaWx0ZXJzIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cbiAgICB0aGlzLmZpbHRlcklucHV0cyA9IG51bGw7XG4gICAgdGhpcy5kcm9wZG93bnMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1ncm91cF0nKTtcbiAgICB0aGlzLnN1bW1hcnlFbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1ncm91cC1zdW1tYXJ5XScpO1xuICAgIHRoaXMuZmlsdGVyQ29udGVudHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1ncm91cC1jb250ZW50XScpO1xuXG4gICAgdGhpcy5jbG9zZWRTdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMub3BlblN0YXRlID0gJ29wZW4nO1xuICAgIHRoaXMuZGlzY2xvc3VyZUFuaW1hdGlvbnMgPSB7fTtcblxuICAgIHRoaXMuZmlsdGVyUmFuZ2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1yYW5nZV0nKTtcbiAgICB0aGlzLnJhbmdlTmFtZXMgPSBbXTtcblxuICAgIHRoaXMuZmlsdGVyUmFuZ2UuZm9yRWFjaChlbCA9PiB7XG4gICAgICB0aGlzLnJhbmdlTmFtZXMucHVzaChlbC5uYW1lKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IG51bGw7XG5cbiAgICB0aGlzLmluaXRGaWx0ZXJFdmVudHMgPSB0aGlzLmluaXRGaWx0ZXJFdmVudHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVByaWNlID0gdGhpcy51cGRhdGVQcmljZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYnVpbGRGaWx0ZXJRdWVyeSA9IHRoaXMuYnVpbGRGaWx0ZXJRdWVyeS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pbml0QW5pbWF0aW9ucygpO1xuICAgIHRoaXMuaW5pdEZpbHRlckV2ZW50cygpO1xuICB9XG5cbiAgaW5pdEZpbHRlckV2ZW50cygpIHtcbiAgICAvKiBGb3IgcmFkaW8gYnV0dG9ucyAqL1xuICAgIHRoaXMuZmlsdGVySW5wdXRzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXItaW5wdXRdJyk7XG5cbiAgICB0aGlzLmZpbHRlcklucHV0cy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihmaWx0ZXIsICdjbGljaycsIGUgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmICh0YXJnZXQuZGF0YXNldC5oYXNPd25Qcm9wZXJ0eSgnZGlzYWJsZWQnKSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maWx0ZXJDbGljayh0YXJnZXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbHRlckNvbnRlbnRzLmZvckVhY2goY29udGVudCA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRTdHlsZVZhcmlhYmxlcyhjb250ZW50KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdrZXl1cCcsIGUgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKiBGb3IgcmFuZ2UgaW5wdXQgKi9cbiAgICB0aGlzLmZpbHRlclJhbmdlLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGZpbHRlciwgJ2NoYW5nZScsIGUgPT4gdGhpcy51cGRhdGVQcmljZShlLmN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGZpbHRlciwgJ2tleXVwJywgZSA9PiB7XG4gICAgICAgIGlmIChlLmtleSAhPT0gJ1RhYicpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVByaWNlKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdW1tYXJ5RWxzLmZvckVhY2goc3VtbWFyeSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihzdW1tYXJ5LCAnY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuYW5pbWF0ZURpc2Nsb3N1cmUoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKiBXaGVuIGNsaWNraW5nIG91dHNpZGUgZHJvcGRvd24gZWxlbWVudCwgY2xvc2UgZHJvcGRvd24gKi9cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihkb2N1bWVudC5ib2R5LCAnY2xpY2snLCBlID0+IHtcbiAgICAgIGlmICghZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtZmlsdGVyLWdyb3VwXScpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VBbGxEcm9wZG93bnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9maWx0ZXJDbGljayh0YXJnZXQpIHtcbiAgICBjb25zdCBjaGVja2JveCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1maWx0ZXItY2hlY2tib3hdJyk7XG5cbiAgICBpZiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1maWx0ZXItYWN0aXZlJykpIHtcbiAgICAgIGlmIChjaGVja2JveCkge1xuICAgICAgICBjaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY2hlY2tlZCcpO1xuICAgICAgfVxuICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1maWx0ZXItYWN0aXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVja2JveCkge1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2hlY2tlZCcsICcnKTtcbiAgICAgIH1cbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsdGVyLWFjdGl2ZScsICcnKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBJbml0aWFsaXplIGFuaW1hdGlvbnMgb24gY2hlY2tib3ggY29udGFpbmVyXG4gICAqIHVzaW5nIGZpbHRlciB0YWcgYXMgSlNPTiBrZXlcbiAgICovXG5cbiAgaW5pdEFuaW1hdGlvbnMoKSB7XG4gICAgdGhpcy5zdW1tYXJ5RWxzLmZvckVhY2goc3VtbWFyeSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gc3VtbWFyeS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICBjb25zdCBjdXJyZW50RGV0YWlsc0VsID0gc3VtbWFyeS5jbG9zZXN0KCdbZGF0YS1maWx0ZXItZ3JvdXBdJyk7XG4gICAgICBjb25zdCBpbmRleCA9IHN1bW1hcnkuZGF0YXNldC5maWx0ZXJHcm91cEluZGV4O1xuICAgICAgdGhpcy5kaXNjbG9zdXJlQW5pbWF0aW9uc1tpbmRleF0gPSB0cmFuc2l0aW9uKHsgZWw6IGZpbHRlckxpc3QsIHN0YXRlOiB0aGlzLmNsb3NlZFN0YXRlIH0pO1xuICAgICAgY3VycmVudERldGFpbHNFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jbG9zZWQtaGVpZ2h0JywgYCR7c3VtbWFyeS5vZmZzZXRIZWlnaHR9cHhgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJ1aWxkRmlsdGVyUXVlcnkoZWxlbWVudCkge1xuICAgIGxldCBzZWFyY2hQYXJhbWV0ZXJzO1xuXG4gICAgLy8gSWYgaW5wdXQgaXMgcHJpY2UgcmFuZ2UsIHRoZSB1cmxfdG9fYWRkIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlXG4gICAgLy8gbmVlZCB0byBidWlsZCB0aGUgcXVlcnkgbWFudWFsbHlcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZpbHRlci1yYW5nZS1pbnB1dCcpKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKCc/JywgJycpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudC5jbG9zZXN0KCdmb3JtJykpO1xuICAgICAgY29uc3QgbmV3U2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSkudG9TdHJpbmcoKTtcblxuICAgICAgLy8gRmlsdGVyIHRocm91Z2ggY3VycmVudCBzZWFyY2ggc3RyaW5nIHRvIHNlZSBpZiBwcmljZSByYW5nZSBpbnB1dCBhbHJlYWR5IGV4aXN0cyxcbiAgICAgIC8vIGlmIGl0IGRvZXMsIGNyZWF0ZSBuZXcgc3RyaW5nIHdpdGhvdXQgY3VycmVudCBwcmljZSByYW5nZSBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBzcGxpdEN1cnJlbnRTZWFyY2ggPSBjdXJyZW50U2VhcmNoLnNwbGl0KCcmJyk7XG5cbiAgICAgIGxldCBmaWx0ZXJlZEN1cnJlbnRTZWFyY2ggPSBzcGxpdEN1cnJlbnRTZWFyY2guZmlsdGVyKHNlYXJjaCA9PiB7XG4gICAgICAgIGlmIChzZWFyY2guaW5jbHVkZXModGhpcy5yYW5nZU5hbWVzWzBdKSB8fCBzZWFyY2guaW5jbHVkZXModGhpcy5yYW5nZU5hbWVzWzFdKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGZpbHRlcmVkQ3VycmVudFNlYXJjaCA9IGZpbHRlcmVkQ3VycmVudFNlYXJjaC5qb2luKCcmJyk7XG5cbiAgICAgIC8vIElmIGN1cnJlbnQgc2VhcmNoIHBhcmFtZXRlcnMgZXhpc3QsIGFwcGVuZCBuZXcgc2VhcmNoIHBhcmFtZXRlcnNcbiAgICAgIC8vIG9uIHRvIGV4aXN0aW5nIHBhcmFtZXRlcnNcbiAgICAgIGlmIChmaWx0ZXJlZEN1cnJlbnRTZWFyY2gubGVuZ3RoID4gMCkge1xuICAgICAgICBzZWFyY2hQYXJhbWV0ZXJzID0gYCR7ZmlsdGVyZWRDdXJyZW50U2VhcmNofSYke25ld1NlYXJjaH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VhcmNoUGFyYW1ldGVycyA9IGAke25ld1NlYXJjaH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB1cmxRdWVyeVN0cmluZyA9ICcnO1xuXG4gICAgdXJsUXVlcnlTdHJpbmcgPSBgPyR7c2VhcmNoUGFyYW1ldGVyc31gO1xuXG4gICAgcmV0dXJuIHVybFF1ZXJ5U3RyaW5nO1xuICB9XG5cbiAgdXBkYXRlUHJpY2UoZWxlbWVudCkge1xuICAgIC8vIGNhbmNlbCBhbnkgcGVuZGluZyByZXF1ZXN0c1xuICAgIGlmICh0aGlzLnVwZGF0ZVRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZVRpbWVvdXQpO1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIHVzZXIgdG8gZmluaXNoIGVudGVyaW5nIGlucHV0IGJlZm9yZSByZWxvYWRpbmcgcGFnZVxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRGaWx0ZXJlZFJlc3VsdHMoZWxlbWVudCk7XG4gICAgfSwgMjAwMCk7XG4gIH1cblxuICBnZXRGaWx0ZXJlZFJlc3VsdHMoZWxlbWVudCkge1xuICAgIGNvbnN0IGZpbHRlclF1ZXJ5ID0gdGhpcy5idWlsZEZpbHRlclF1ZXJ5KGVsZW1lbnQpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPSBmaWx0ZXJRdWVyeTtcbiAgfVxuXG4gIGFuaW1hdGVEaXNjbG9zdXJlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBmaWx0ZXJMaXN0ID0gc3VtbWFyeS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgY29uc3QgY3VycmVudERldGFpbHNFbCA9IHN1bW1hcnkuY2xvc2VzdCgnW2RhdGEtZmlsdGVyLWdyb3VwXScpO1xuXG4gICAgLyogSGFuZGxlIGRyb3Bkb3ducyBvbiBjbGljayBldmVudCBvdXRzaWRlIGRpc2Nsb3N1cmUgKi9cbiAgICBpZiAoZmlsdGVyTGlzdCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWx0ZXJMaXN0LmRhdGFzZXQuYW5pbWF0aW9uKSByZXR1cm47XG5cbiAgICAgIGlmIChmaWx0ZXJMaXN0LmRhdGFzZXQuYW5pbWF0aW9uU3RhdGUgPT09IHRoaXMub3BlblN0YXRlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEaXNjbG9zdXJlKGN1cnJlbnREZXRhaWxzRWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogQ2xvc2UgYW55IG9wZW4gZHJvcGRvd25zIGJlZm9yZSBvcGVuaW5nIG5ldyBkcm9wZG93biAqL1xuICAgICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XG4gICAgICAgIHRoaXMub3BlbkRpc2Nsb3N1cmUoY3VycmVudERldGFpbHNFbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3NldFN0eWxlVmFyaWFibGVzKGVsKSB7XG4gICAgLy8gT24gZGVza3RvcCwgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBkcm9wZG93biBvdmVyZmxvd3MgdGhlXG4gICAgLy8gdmlld3BvcnQsIGFuZCBhZGQgYSBjbGFzcyBpZiBpdCBkb2VzIHNvIHdlIGNhbiBhbGlnbiBpdFxuICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBzdW1tYXJ5IGVsZW1lbnQgYWNjb3JkaW5nbHlcblxuICAgIGNvbnN0IHsgcmlnaHQ6IHJpZ2h0Qm91bmRzLCBsZWZ0OiBsZWZ0Qm91bmRzIH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmIChyaWdodEJvdW5kcyA+PSB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZmlsdGVycy0tb3ZlcmZsb3ctcmlnaHQnKTtcbiAgICB9XG5cbiAgICBpZiAobGVmdEJvdW5kcyA8PSAwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmaWx0ZXJzLS1vdmVyZmxvdy1sZWZ0Jyk7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byBhYnNvbHV0ZWx5IHBvc2l0aW9uIHRoZSBvcGVuIGRpc2Nsb3N1cmUgdG8gY2VudGVyIGl0IG9uIG1vYmlsZVxuICAgIC8vIGFuZCBtYWtlIGl0IGZ1bGwgc2NyZWVuLCBzbyB3ZSBzZXQgc29tZSBDU1MgdmFyaWFibGVzIHRvIGRvIHRoYXRcbiAgICBjb25zdCB3cmFwcGVyID0gZWwuY2xvc2VzdCgnLmZhY2V0ZWQtZmlsdGVycycpO1xuXG4gICAgY29uc3QgeyB3aWR0aDogbW9iaWxlV2lkdGgsIGxlZnQ6IG1vYmlsZUxlZnQgfSA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tb2JpbGUtd2lkdGgnLCBgJHttb2JpbGVXaWR0aH1weGApO1xuICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCctLW1vYmlsZS1sZWZ0JywgYCR7bW9iaWxlTGVmdH1weGApO1xuXG4gICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJy0tb3Blbi1oZWlnaHQnLCBgJHtlbC5vZmZzZXRIZWlnaHR9cHhgKTtcbiAgfVxuXG4gIG9wZW5EaXNjbG9zdXJlKGRldGFpbHNFbCkge1xuICAgIGNvbnN0IGluZGV4ID0gZGV0YWlsc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZpbHRlci1ncm91cC1zdW1tYXJ5XScpLmRhdGFzZXQuZmlsdGVyR3JvdXBJbmRleDtcbiAgICBkZXRhaWxzRWwuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpO1xuXG4gICAgdGhpcy5kaXNjbG9zdXJlQW5pbWF0aW9uc1tpbmRleF1cbiAgICAgIC5hbmltYXRlVG8odGhpcy5vcGVuU3RhdGUsIHtcbiAgICAgICAgb25TdGFydDogKHsgZWwgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NldFN0eWxlVmFyaWFibGVzKGVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBkZXRhaWxzRWwuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tZXhwYW5kZWQnKTtcbiAgfVxuXG4gIGNsb3NlRGlzY2xvc3VyZShkZXRhaWxzRWwpIHtcbiAgICBjb25zdCBpbmRleCA9IGRldGFpbHNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1maWx0ZXItZ3JvdXAtc3VtbWFyeV0nKS5kYXRhc2V0LmZpbHRlckdyb3VwSW5kZXg7XG5cbiAgICB0aGlzLmRpc2Nsb3N1cmVBbmltYXRpb25zW2luZGV4XVxuICAgICAgLmFuaW1hdGVUbyh0aGlzLmNsb3NlZFN0YXRlKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBkZXRhaWxzRWwucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG4gICAgICB9KTtcblxuICAgIGRldGFpbHNFbC5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wZG93bi1leHBhbmRlZCcpO1xuICB9XG5cbiAgY2xvc2VBbGxEcm9wZG93bnMoKSB7XG4gICAgdGhpcy5kcm9wZG93bnMuZm9yRWFjaChkcm9wZG93biA9PiB7XG4gICAgICBpZiAoZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdkcm9wZG93bi1leHBhbmRlZCcpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEaXNjbG9zdXJlKGRyb3Bkb3duKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBpZiAodGhpcy5ldmVudHMpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxRQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/FacetedFilters.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/ImageZoom.js":
+/*!************************************************!*\
+ !*** ./source/scripts/components/ImageZoom.js ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ImageZoom)\n/* harmony export */ });\nclass ImageZoom {\n constructor(component) {\n this.viewport = component.viewport;\n this.images = component.images;\n this.imageId = null;\n this.el = null;\n this.zoomArea = null;\n this.zoomAreaContainer = null;\n this.toggleZoomEvent = this.toggleZoom.bind(this);\n this.zoomImageEvent = this.zoomImage.bind(this);\n this.setVariables();\n this.prepareZoom();\n }\n\n _unbindEvents() {\n if (this.zoomAreaContainer) {\n this.zoomAreaContainer.removeEventListener('click', this.toggleZoomEvent);\n }\n\n if (this.zoomArea) {\n this.zoomArea.removeEventListener('mouseout', this.toggleZoomEvent);\n this.zoomArea.removeEventListener('mousemove', this.zoomImageEvent);\n }\n }\n\n setVariables() {\n const currentImage = this.viewport.querySelector('[data-product-gallery-selected=\"true\"] img');\n\n if (!currentImage) {\n this.imageId = null;\n this.el = null;\n this.zoomArea = null;\n this.zoomAreaContainer = null;\n return;\n }\n\n this.imageId = currentImage.getAttribute('data-image-zoom');\n const div = document.createElement('div');\n div.innerHTML = this.images[this.imageId];\n this.el = div.firstElementChild;\n this.zoomArea = this.viewport.querySelector(`[data-product-zoom-id=\"${this.imageId}\"]`);\n this.zoomAreaContainer = this.viewport.querySelector(`[data-media=\"${this.imageId}\"] .product-gallery--media-wrapper`);\n this.zoomAreaContainer.addEventListener('click', this.toggleZoomEvent);\n this.zoomArea.addEventListener('mouseout', this.toggleZoomEvent);\n this.zoomArea.addEventListener('mousemove', this.zoomImageEvent);\n }\n\n prepareZoom(resetVariables) {\n if (resetVariables) {\n this._unbindEvents();\n\n this.setVariables();\n }\n\n if (!this.imageId) return;\n const imageSource = this.el.getAttribute('src');\n const {\n width: photoAreaWidth,\n height: photoAreaHeight\n } = this.zoomAreaContainer.getBoundingClientRect();\n const newImage = new Image();\n newImage.addEventListener('load', () => {\n this.zoomImageWidth = newImage.width;\n this.zoomImageHeight = newImage.height;\n const ratio = Math.max(this.zoomImageWidth / photoAreaWidth, this.zoomImageHeight / photoAreaHeight); // Only enable the zoom if a certain zooming ratio is met.\n\n if (ratio < 1.4) {\n this.zoomAreaContainer.classList.remove('zoom-enabled');\n } else {\n this.zoomAreaContainer.classList.add('zoom-enabled');\n this.zoomArea.style.backgroundImage = `url(${imageSource})`;\n }\n });\n newImage.src = imageSource;\n }\n\n toggleZoom(e) {\n if (this.zoomAreaContainer.classList.contains('zoom-enabled')) {\n if (e.type === 'mouseout') {\n this.zoomArea.classList.remove('active');\n return;\n }\n\n this.zoomArea.classList.toggle('active');\n this.zoomImage(e);\n }\n }\n\n zoomImage(e) {\n const {\n width: zoomWidth,\n height: zoomHeight\n } = this.zoomArea.getBoundingClientRect();\n const {\n top: bigImageTop,\n left: bigImageLeft\n } = this.zoomAreaContainer.getBoundingClientRect();\n const bigImageX = Math.round(bigImageLeft);\n const bigImageY = Math.round(bigImageTop);\n const mousePositionX = e.clientX - bigImageX;\n const mousePositionY = e.clientY - bigImageY; // Make sure our mouse position is still inside our box.\n\n if (mousePositionX < zoomWidth && mousePositionY < zoomHeight && mousePositionX > 0 && mousePositionY > 0) {\n if (this.zoomArea.classList.contains('active')) {\n // Figure out how to position the zoomed image.\n let ratioX = Math.round(mousePositionX / zoomWidth * this.zoomImageWidth - zoomWidth / 2) * -1;\n let ratioY = Math.round(mousePositionY / zoomHeight * this.zoomImageHeight - zoomHeight / 2) * -1;\n\n if (ratioX > 0) {\n ratioX = 0;\n }\n\n if (ratioY > 0) {\n ratioY = 0;\n }\n\n if (ratioX < -(this.zoomImageWidth - zoomWidth)) {\n ratioX = -(this.zoomImageWidth - zoomWidth);\n }\n\n if (ratioY < -(this.zoomImageHeight - zoomHeight)) {\n ratioY = -(this.zoomImageHeight - zoomHeight);\n }\n\n const newBackgroundPosition = `${ratioX}px ${ratioY}px`;\n this.zoomArea.style.backgroundPosition = newBackgroundPosition;\n }\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0ltYWdlWm9vbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0ltYWdlWm9vbS5qcz9hMjU4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlWm9vbSB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkge1xuICAgIHRoaXMudmlld3BvcnQgPSBjb21wb25lbnQudmlld3BvcnQ7XG4gICAgdGhpcy5pbWFnZXMgPSBjb21wb25lbnQuaW1hZ2VzO1xuICAgIHRoaXMuaW1hZ2VJZCA9IG51bGw7XG4gICAgdGhpcy5lbCA9IG51bGw7XG4gICAgdGhpcy56b29tQXJlYSA9IG51bGw7XG4gICAgdGhpcy56b29tQXJlYUNvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy50b2dnbGVab29tRXZlbnQgPSB0aGlzLnRvZ2dsZVpvb20uYmluZCh0aGlzKTtcbiAgICB0aGlzLnpvb21JbWFnZUV2ZW50ID0gdGhpcy56b29tSW1hZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldFZhcmlhYmxlcygpO1xuICAgIHRoaXMucHJlcGFyZVpvb20oKTtcbiAgfVxuXG4gIF91bmJpbmRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuem9vbUFyZWFDb250YWluZXIpIHtcbiAgICAgIHRoaXMuem9vbUFyZWFDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRvZ2dsZVpvb21FdmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuem9vbUFyZWEpIHtcbiAgICAgIHRoaXMuem9vbUFyZWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLnRvZ2dsZVpvb21FdmVudCk7XG4gICAgICB0aGlzLnpvb21BcmVhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuem9vbUltYWdlRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZhcmlhYmxlcygpIHtcbiAgICBjb25zdCBjdXJyZW50SW1hZ2UgPSB0aGlzLnZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeS1zZWxlY3RlZD1cInRydWVcIl0gaW1nJyk7XG4gICAgaWYgKCFjdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuaW1hZ2VJZCA9IG51bGw7XG4gICAgICB0aGlzLmVsID0gbnVsbDtcbiAgICAgIHRoaXMuem9vbUFyZWEgPSBudWxsO1xuICAgICAgdGhpcy56b29tQXJlYUNvbnRhaW5lciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZUlkID0gY3VycmVudEltYWdlLmdldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS16b29tJyk7XG5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGRpdi5pbm5lckhUTUwgPSB0aGlzLmltYWdlc1t0aGlzLmltYWdlSWRdO1xuICAgIHRoaXMuZWwgPSBkaXYuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgdGhpcy56b29tQXJlYSA9IHRoaXMudmlld3BvcnQucXVlcnlTZWxlY3RvcihgW2RhdGEtcHJvZHVjdC16b29tLWlkPVwiJHt0aGlzLmltYWdlSWR9XCJdYCk7XG4gICAgdGhpcy56b29tQXJlYUNvbnRhaW5lciA9IHRoaXMudmlld3BvcnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbWVkaWE9XCIke3RoaXMuaW1hZ2VJZH1cIl0gLnByb2R1Y3QtZ2FsbGVyeS0tbWVkaWEtd3JhcHBlcmApO1xuXG4gICAgdGhpcy56b29tQXJlYUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlWm9vbUV2ZW50KTtcbiAgICB0aGlzLnpvb21BcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy50b2dnbGVab29tRXZlbnQpO1xuICAgIHRoaXMuem9vbUFyZWEuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy56b29tSW1hZ2VFdmVudCk7XG4gIH1cblxuICBwcmVwYXJlWm9vbShyZXNldFZhcmlhYmxlcykge1xuICAgIGlmIChyZXNldFZhcmlhYmxlcykge1xuICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlcygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pbWFnZUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBpbWFnZVNvdXJjZSA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICBjb25zdCB7IHdpZHRoOiBwaG90b0FyZWFXaWR0aCwgaGVpZ2h0OiBwaG90b0FyZWFIZWlnaHQgfSA9IHRoaXMuem9vbUFyZWFDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBuZXdJbWFnZSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgbmV3SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgIHRoaXMuem9vbUltYWdlV2lkdGggPSBuZXdJbWFnZS53aWR0aDtcbiAgICAgIHRoaXMuem9vbUltYWdlSGVpZ2h0ID0gbmV3SW1hZ2UuaGVpZ2h0O1xuXG4gICAgICBjb25zdCByYXRpbyA9IE1hdGgubWF4KFxuICAgICAgICB0aGlzLnpvb21JbWFnZVdpZHRoIC8gcGhvdG9BcmVhV2lkdGgsXG4gICAgICAgIHRoaXMuem9vbUltYWdlSGVpZ2h0IC8gcGhvdG9BcmVhSGVpZ2h0LFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSBlbmFibGUgdGhlIHpvb20gaWYgYSBjZXJ0YWluIHpvb21pbmcgcmF0aW8gaXMgbWV0LlxuICAgICAgaWYgKHJhdGlvIDwgMS40KSB7XG4gICAgICAgIHRoaXMuem9vbUFyZWFDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnem9vbS1lbmFibGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnpvb21BcmVhQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3pvb20tZW5hYmxlZCcpO1xuXG4gICAgICAgIHRoaXMuem9vbUFyZWEuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2ltYWdlU291cmNlfSlgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbmV3SW1hZ2Uuc3JjID0gaW1hZ2VTb3VyY2U7XG4gIH1cblxuICB0b2dnbGVab29tKGUpIHtcbiAgICBpZiAodGhpcy56b29tQXJlYUNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ3pvb20tZW5hYmxlZCcpKSB7XG4gICAgICBpZiAoZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG4gICAgICAgIHRoaXMuem9vbUFyZWEuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy56b29tQXJlYS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTtcblxuICAgICAgdGhpcy56b29tSW1hZ2UoZSk7XG4gICAgfVxuICB9XG5cbiAgem9vbUltYWdlKGUpIHtcbiAgICBjb25zdCB7IHdpZHRoOiB6b29tV2lkdGgsIGhlaWdodDogem9vbUhlaWdodCB9ID0gdGhpcy56b29tQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB7IHRvcDogYmlnSW1hZ2VUb3AsIGxlZnQ6IGJpZ0ltYWdlTGVmdCB9ID0gdGhpcy56b29tQXJlYUNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGJpZ0ltYWdlWCA9IE1hdGgucm91bmQoYmlnSW1hZ2VMZWZ0KTtcbiAgICBjb25zdCBiaWdJbWFnZVkgPSBNYXRoLnJvdW5kKGJpZ0ltYWdlVG9wKTtcblxuICAgIGNvbnN0IG1vdXNlUG9zaXRpb25YID0gZS5jbGllbnRYIC0gYmlnSW1hZ2VYO1xuICAgIGNvbnN0IG1vdXNlUG9zaXRpb25ZID0gZS5jbGllbnRZIC0gYmlnSW1hZ2VZO1xuXG4gICAgLy8gTWFrZSBzdXJlIG91ciBtb3VzZSBwb3NpdGlvbiBpcyBzdGlsbCBpbnNpZGUgb3VyIGJveC5cbiAgICBpZiAoKG1vdXNlUG9zaXRpb25YIDwgem9vbVdpZHRoKVxuICAgICAgJiYgKG1vdXNlUG9zaXRpb25ZIDwgem9vbUhlaWdodClcbiAgICAgICYmIChtb3VzZVBvc2l0aW9uWCA+IDApXG4gICAgICAmJiAobW91c2VQb3NpdGlvblkgPiAwKSkge1xuICAgICAgaWYgKHRoaXMuem9vbUFyZWEuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyB0byBwb3NpdGlvbiB0aGUgem9vbWVkIGltYWdlLlxuICAgICAgICBsZXQgcmF0aW9YID0gTWF0aC5yb3VuZCgoKG1vdXNlUG9zaXRpb25YIC8gem9vbVdpZHRoKSAqIHRoaXMuem9vbUltYWdlV2lkdGgpIC0gKHpvb21XaWR0aCAvIDIpKSAqIC0xO1xuICAgICAgICBsZXQgcmF0aW9ZID0gTWF0aC5yb3VuZCgoKG1vdXNlUG9zaXRpb25ZIC8gem9vbUhlaWdodCkgKiB0aGlzLnpvb21JbWFnZUhlaWdodCkgLSAoem9vbUhlaWdodCAvIDIpKSAqIC0xO1xuXG4gICAgICAgIGlmIChyYXRpb1ggPiAwKSB7IHJhdGlvWCA9IDA7IH1cbiAgICAgICAgaWYgKHJhdGlvWSA+IDApIHsgcmF0aW9ZID0gMDsgfVxuXG4gICAgICAgIGlmIChyYXRpb1ggPCAtKHRoaXMuem9vbUltYWdlV2lkdGggLSB6b29tV2lkdGgpKSB7XG4gICAgICAgICAgcmF0aW9YID0gLSh0aGlzLnpvb21JbWFnZVdpZHRoIC0gem9vbVdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmF0aW9ZIDwgLSh0aGlzLnpvb21JbWFnZUhlaWdodCAtIHpvb21IZWlnaHQpKSB7XG4gICAgICAgICAgcmF0aW9ZID0gLSh0aGlzLnpvb21JbWFnZUhlaWdodCAtIHpvb21IZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3QmFja2dyb3VuZFBvc2l0aW9uID0gYCR7cmF0aW9YfXB4ICR7cmF0aW9ZfXB4YDtcblxuICAgICAgICB0aGlzLnpvb21BcmVhLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9IG5ld0JhY2tncm91bmRQb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcklBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/ImageZoom.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/MasonryGrid.js":
+/*!**************************************************!*\
+ !*** ./source/scripts/components/MasonryGrid.js ***!
+ \**************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ MasonryGrid)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var masonry_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! masonry-layout */ \"./node_modules/masonry-layout/masonry.js\");\n/* harmony import */ var masonry_layout__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(masonry_layout__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\n\nclass MasonryGrid {\n constructor({\n el,\n settings\n }) {\n this.el = el;\n this.layout = this.layout.bind(this);\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.el);\n const defaultSettings = {\n itemSelector: '[data-masonry-item]',\n columnWidth: '[data-masonry-sizer]',\n gutter: 0,\n percentPosition: false\n };\n this.settings = _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.extend(defaultSettings, settings);\n this.masonry = new (masonry_layout__WEBPACK_IMPORTED_MODULE_1___default())(this.el, this.settings);\n this.layout();\n this.el.addEventListener('rimg:load', this.layout);\n }\n\n layout() {\n this.masonry.layout();\n }\n\n unload() {\n this.masonry.destroy();\n this.el.removeEventListener('rimg:load', this.layout);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01hc29ucnlHcmlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvTWFzb25yeUdyaWQuanM/ODI4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IE1hc29ucnkgZnJvbSAnbWFzb25yeS1sYXlvdXQnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc29ucnlHcmlkIHtcbiAgY29uc3RydWN0b3IoeyBlbCwgc2V0dGluZ3MgfSkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmxheW91dCA9IHRoaXMubGF5b3V0LmJpbmQodGhpcyk7XG4gICAgcmltZy53YXRjaCh0aGlzLmVsKTtcblxuICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHtcbiAgICAgIGl0ZW1TZWxlY3RvcjogJ1tkYXRhLW1hc29ucnktaXRlbV0nLFxuICAgICAgY29sdW1uV2lkdGg6ICdbZGF0YS1tYXNvbnJ5LXNpemVyXScsXG4gICAgICBndXR0ZXI6IDAsXG4gICAgICBwZXJjZW50UG9zaXRpb246IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLnNldHRpbmdzID0gdGhlbWVVdGlscy5leHRlbmQoZGVmYXVsdFNldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgdGhpcy5tYXNvbnJ5ID0gbmV3IE1hc29ucnkodGhpcy5lbCwgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5sYXlvdXQoKTtcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsIHRoaXMubGF5b3V0KTtcbiAgfVxuXG4gIGxheW91dCgpIHtcbiAgICB0aGlzLm1hc29ucnkubGF5b3V0KCk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5tYXNvbnJ5LmRlc3Ryb3koKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsIHRoaXMubGF5b3V0KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEzQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/MasonryGrid.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/MasonryVideo.js":
+/*!***************************************************!*\
+ !*** ./source/scripts/components/MasonryVideo.js ***!
+ \***************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ MasonryVideo)\n/* harmony export */ });\n/* harmony import */ var reframe_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reframe.js */ \"./node_modules/reframe.js/dist/reframe.es.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Modal */ \"./source/scripts/components/Modal.js\");\n\n\nclass MasonryVideo {\n constructor(el, event) {\n this.el = el;\n this.modal = null;\n const {\n currentTarget: target\n } = event;\n const modalID = target.dataset.masonryVideo;\n const modalEl = this.el.querySelector(`[data-modal-id=\"${modalID}\"]`);\n this.modal = new _Modal__WEBPACK_IMPORTED_MODULE_1__.default({\n el: modalEl,\n callbacks: {\n onOpen: ({\n modal,\n contents\n }) => this._open({\n modal,\n contents\n }),\n onClose: () => this._close()\n }\n });\n this.modal.open();\n }\n\n onSectionUnload() {\n if (this.modal) {\n this.modal.close();\n }\n }\n\n _open({\n modal,\n contents\n }) {\n const video = modal.querySelector('[data-masonry-video]');\n\n try {\n contents.innerHTML = JSON.parse(video.innerText);\n (0,reframe_js__WEBPACK_IMPORTED_MODULE_0__.default)(contents);\n (0,reframe_js__WEBPACK_IMPORTED_MODULE_0__.default)(contents.querySelectorAll('iframe'));\n this.modal.showModal();\n } catch {\n console.warn('Unable to parse contents of video');\n }\n }\n\n _close() {\n this.modal = null;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01hc29ucnlWaWRlby5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01hc29ucnlWaWRlby5qcz8wZDU3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWZyYW1lIGZyb20gJ3JlZnJhbWUuanMnO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4vTW9kYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNvbnJ5VmlkZW8ge1xuICBjb25zdHJ1Y3RvcihlbCwgZXZlbnQpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5tb2RhbCA9IG51bGw7XG5cbiAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQ6IHRhcmdldCB9ID0gZXZlbnQ7XG4gICAgY29uc3QgbW9kYWxJRCA9IHRhcmdldC5kYXRhc2V0Lm1hc29ucnlWaWRlbztcbiAgICBjb25zdCBtb2RhbEVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tb2RhbC1pZD1cIiR7bW9kYWxJRH1cIl1gKTtcblxuICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwoe1xuICAgICAgZWw6IG1vZGFsRWwsXG4gICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgb25PcGVuOiAoeyBtb2RhbCwgY29udGVudHMgfSkgPT4gdGhpcy5fb3Blbih7XG4gICAgICAgICAgbW9kYWwsXG4gICAgICAgICAgY29udGVudHMsXG4gICAgICAgIH0pLFxuICAgICAgICBvbkNsb3NlOiAoKSA9PiB0aGlzLl9jbG9zZSgpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMubW9kYWwub3BlbigpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGlmICh0aGlzLm1vZGFsKSB7XG4gICAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgX29wZW4oeyBtb2RhbCwgY29udGVudHMgfSkge1xuICAgIGNvbnN0IHZpZGVvID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS12aWRlb10nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb250ZW50cy5pbm5lckhUTUwgPSBKU09OLnBhcnNlKHZpZGVvLmlubmVyVGV4dCk7XG5cbiAgICAgIHJlZnJhbWUoY29udGVudHMpO1xuICAgICAgcmVmcmFtZShjb250ZW50cy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSk7XG5cbiAgICAgIHRoaXMubW9kYWwuc2hvd01vZGFsKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBwYXJzZSBjb250ZW50cyBvZiB2aWRlbycpO1xuICAgIH1cbiAgfVxuXG4gIF9jbG9zZSgpIHtcbiAgICB0aGlzLm1vZGFsID0gbnVsbDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUxBO0FBRkE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBL0NBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/MasonryVideo.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/Modal.js":
+/*!********************************************!*\
+ !*** ./source/scripts/components/Modal.js ***!
+ \********************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Modal)\n/* harmony export */ });\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\nclass Modal {\n constructor(component = {}, options = {}) {\n this.options = options;\n this.el = component.el;\n this.modalInner = this.el.querySelector('[data-modal-inner]');\n this.contents = this.el.querySelector('[data-modal-contents]');\n this.mobileFriendly = 'modalMobileFriendly' in this.el.dataset;\n this.el.querySelector('[data-modal-close]').addEventListener('click', () => this.close());\n this.selectors = {\n open: 'modal-opened',\n visible: 'modal-visible',\n active: 'modal-active',\n scrollLock: 'scroll-locked'\n };\n const defaultCallbacks = {\n onOpen: () => ({}),\n onClose: () => ({})\n };\n this.callbacks = { ...defaultCallbacks,\n ...component.callbacks\n };\n } // Manually open a modal.\n\n\n open() {\n this.el.classList.add(this.selectors.open);\n window.addEventListener('resize', () => this._resize()); // Use onOpen to insert contents into modal\n\n return this.callbacks.onOpen({\n modal: this.el,\n contents: this.contents\n });\n } // Close modal, and clean up\n\n\n close() {\n this.el.classList.remove(this.selectors.active);\n this.el.classList.remove(this.selectors.visible);\n this.el.classList.remove(this.selectors.open);\n document.body.classList.remove(this.selectors.scrollLock);\n this.contents.innerHTML = '';\n this.callbacks.onClose();\n window.removeEventListener('resize', () => this._resize());\n }\n /*\n Make a modal visible after content has been added\n */\n\n\n showModal() {\n // Wait on animation frame after opening to ensure animations are played\n window.requestAnimationFrame(() => {\n document.body.classList.add(this.selectors.scrollLock);\n\n if (this.options && this.options.reposition && this.options.reposition !== false) {\n this._position();\n }\n\n this.el.addEventListener('transitionend', () => this.el.classList.add(this.selectors.active));\n this.el.classList.add(this.selectors.visible);\n });\n }\n\n _resize() {\n if (this.options && this.options.reposition && this.options.reposition !== false) {\n this._position();\n } // Some modals shouldn't be visible on mobile\n\n\n if (!this.mobileFriendly) {\n const windowWidth = _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.windowWidth();\n\n if (windowWidth > _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.breakpoints.small) {\n return;\n }\n\n this.close();\n }\n }\n /*\n Center modal vertically and horizontally\n */\n\n\n _position() {\n const {\n width,\n height\n } = this.modalInner.getBoundingClientRect();\n this.modalInner.style.marginTop = `${-(height / 2)}px`;\n this.modalInner.style.marginLeft = `${-(width / 2)}px`;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01vZGFsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvTW9kYWwuanM/NjBhZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kYWwge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmVsID0gY29tcG9uZW50LmVsO1xuICAgIHRoaXMubW9kYWxJbm5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtaW5uZXJdJyk7XG4gICAgdGhpcy5jb250ZW50cyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtY29udGVudHNdJyk7XG4gICAgdGhpcy5tb2JpbGVGcmllbmRseSA9ICdtb2RhbE1vYmlsZUZyaWVuZGx5JyBpbiB0aGlzLmVsLmRhdGFzZXQ7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLWNsb3NlXScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcblxuICAgIHRoaXMuc2VsZWN0b3JzID0ge1xuICAgICAgb3BlbjogJ21vZGFsLW9wZW5lZCcsXG4gICAgICB2aXNpYmxlOiAnbW9kYWwtdmlzaWJsZScsXG4gICAgICBhY3RpdmU6ICdtb2RhbC1hY3RpdmUnLFxuICAgICAgc2Nyb2xsTG9jazogJ3Njcm9sbC1sb2NrZWQnLFxuICAgIH07XG5cbiAgICBjb25zdCBkZWZhdWx0Q2FsbGJhY2tzID0ge1xuICAgICAgb25PcGVuOiAoKSA9PiAoe30pLFxuICAgICAgb25DbG9zZTogKCkgPT4gKHt9KSxcbiAgICB9O1xuXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7XG4gICAgICAuLi5kZWZhdWx0Q2FsbGJhY2tzLFxuICAgICAgLi4uY29tcG9uZW50LmNhbGxiYWNrcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gTWFudWFsbHkgb3BlbiBhIG1vZGFsLlxuICBvcGVuKCkge1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdG9ycy5vcGVuKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5fcmVzaXplKCkpO1xuXG4gICAgLy8gVXNlIG9uT3BlbiB0byBpbnNlcnQgY29udGVudHMgaW50byBtb2RhbFxuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5vbk9wZW4oe1xuICAgICAgbW9kYWw6IHRoaXMuZWwsXG4gICAgICBjb250ZW50czogdGhpcy5jb250ZW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENsb3NlIG1vZGFsLCBhbmQgY2xlYW4gdXBcbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2VsZWN0b3JzLmFjdGl2ZSk7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2VsZWN0b3JzLnZpc2libGUpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNlbGVjdG9ycy5vcGVuKTtcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNlbGVjdG9ycy5zY3JvbGxMb2NrKTtcblxuICAgIHRoaXMuY29udGVudHMuaW5uZXJIVE1MID0gJyc7XG5cbiAgICB0aGlzLmNhbGxiYWNrcy5vbkNsb3NlKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3Jlc2l6ZSgpKTtcbiAgfVxuXG4gIC8qXG4gICAgICAgICAgICBNYWtlIGEgbW9kYWwgdmlzaWJsZSBhZnRlciBjb250ZW50IGhhcyBiZWVuIGFkZGVkXG4gICAgICAgICAgICAqL1xuICBzaG93TW9kYWwoKSB7XG4gICAgLy8gV2FpdCBvbiBhbmltYXRpb24gZnJhbWUgYWZ0ZXIgb3BlbmluZyB0byBlbnN1cmUgYW5pbWF0aW9ucyBhcmUgcGxheWVkXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQodGhpcy5zZWxlY3RvcnMuc2Nyb2xsTG9jayk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlcG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnJlcG9zaXRpb24gIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdG9ycy5hY3RpdmUpKTtcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdG9ycy52aXNpYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9yZXNpemUoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucmVwb3NpdGlvbiAmJiB0aGlzLm9wdGlvbnMucmVwb3NpdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gU29tZSBtb2RhbHMgc2hvdWxkbid0IGJlIHZpc2libGUgb24gbW9iaWxlXG4gICAgaWYgKCF0aGlzLm1vYmlsZUZyaWVuZGx5KSB7XG4gICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHRoZW1lVXRpbHMud2luZG93V2lkdGgoKTtcbiAgICAgIGlmICh3aW5kb3dXaWR0aCA+IHRoZW1lVXRpbHMuYnJlYWtwb2ludHMuc21hbGwpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICAgICAgICAgIENlbnRlciBtb2RhbCB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICovXG4gIF9wb3NpdGlvbigpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMubW9kYWxJbm5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMubW9kYWxJbm5lci5zdHlsZS5tYXJnaW5Ub3AgPSBgJHstKGhlaWdodCAvIDIpfXB4YDtcbiAgICB0aGlzLm1vZGFsSW5uZXIuc3R5bGUubWFyZ2luTGVmdCA9IGAkey0od2lkdGggLyAyKX1weGA7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBRUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQTdGQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/Modal.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/PredictiveSearch.js":
+/*!*******************************************************!*\
+ !*** ./source/scripts/components/PredictiveSearch.js ***!
+ \*******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PredictiveSearch)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _SiteOverlay__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./SiteOverlay */ \"./source/scripts/components/SiteOverlay.js\");\n\n\n\n\n\nclass PredictiveSearch {\n constructor({\n el\n }) {\n this.el = el;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.siteOverlay = new _SiteOverlay__WEBPACK_IMPORTED_MODULE_4__.default();\n this.input = this.el.querySelector('[data-search-input]');\n this.results = this.el.querySelector('[data-search-results]');\n this.resultsContainer = this.el.querySelector('[data-search-results-container]');\n this.animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n el: this.resultsContainer\n });\n this.isOpen = false;\n this.events.register(window, 'keyup', e => this._onKeyUp(e));\n this.events.register(window, 'resize', _themeUtils__WEBPACK_IMPORTED_MODULE_3__.default.debounce(() => this._onResize(), 250));\n this.events.register(this.el, 'submit', e => this._onSubmit(e));\n this.events.register(this.input, 'input', _themeUtils__WEBPACK_IMPORTED_MODULE_3__.default.debounce(() => this._onChange(), 250));\n this.events.register(this.input, 'focus', () => this._onFocus());\n this.events.register(this.input, 'keydown', e => this._onKeydown(e));\n this.events.register(document.body, 'click', e => {\n if (!e.target.closest('[data-search-form]')) {\n this._close();\n }\n });\n }\n\n _getQuery() {\n return this.input.value.trim();\n }\n\n _onChange() {\n const searchTerm = this._getQuery();\n\n if (!searchTerm.length) {\n this._close();\n\n return;\n }\n\n this._getSearchResults(searchTerm);\n }\n\n _onBlur() {\n this._close();\n }\n\n _onFocus() {\n const searchTerm = this._getQuery();\n\n if (!searchTerm.length) return;\n\n this._getSearchResults(searchTerm);\n }\n\n _onSubmit(e) {\n if (!this._getQuery().length) e.preventDefault();\n }\n\n _onKeyUp(e) {\n if (e.code === 'Escape') {\n this.input.value = '';\n\n this._close();\n }\n }\n\n _onKeydown(e) {\n // Prevent the cursor from moving in the input when using the up and down arrow keys\n if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\n e.preventDefault();\n }\n }\n\n _onResize() {\n this._resizeSearchResults();\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_3__.default.isLessThanLarge()) {\n this._close();\n }\n }\n\n _getSearchResults(searchTerm) {\n this.resultsContainer.setAttribute('data-loading', 'true');\n fetch(`${window.Theme.routes.predictive_search_url}?q=${encodeURIComponent(searchTerm)}§ion_id=predictive-search`).then(response => {\n if (!response.ok) {\n const error = new Error(response.status);\n\n this._close();\n\n throw error;\n }\n\n return response.text();\n }).then(text => {\n const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-predictive-search').innerHTML;\n\n this._renderSearchResults(resultsMarkup);\n\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(this.results);\n }).catch(error => {\n this._close();\n\n throw error;\n });\n }\n\n _registerEvents() {\n this.searchButton = this.el.querySelector('[data-predictive-search-button]');\n this.events.register(this.searchButton, 'blur', () => this._onBlur());\n }\n\n _resizeSearchResults() {\n const offset = 30;\n const position = this.input.getBoundingClientRect();\n const maxHeight = window.innerHeight - position.bottom - offset;\n this.resultsContainer.style.setProperty('--results-container-height', `${maxHeight}px`);\n }\n\n _renderSearchResults(resultsMarkup) {\n this.resultsContainer.setAttribute('data-loading', 'false');\n this.results.innerHTML = resultsMarkup;\n\n this._open();\n\n this._registerEvents();\n\n this._resizeSearchResults();\n }\n\n _open() {\n if (this.isOpen) return;\n this.isOpen = true;\n this.animation.animateTo('open').then(() => {\n document.body.classList.add('scroll-locked');\n this.siteOverlay.open();\n });\n }\n\n _close() {\n if (!this.isOpen) return;\n this.animation.animateTo('closed').then(() => {\n this.isOpen = false;\n document.body.classList.remove('scroll-locked');\n this.siteOverlay.close();\n });\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1ByZWRpY3RpdmVTZWFyY2guanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9QcmVkaWN0aXZlU2VhcmNoLmpzP2FkMWIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IHsgdHJhbnNpdGlvbiB9IGZyb20gJ0BwaXhlbHVuaW9uL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcbmltcG9ydCB0aGVtZVV0aWxzIGZyb20gJy4uL3RoZW1lVXRpbHMnO1xuaW1wb3J0IFNpdGVPdmVybGF5IGZyb20gJy4vU2l0ZU92ZXJsYXknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcmVkaWN0aXZlU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoeyBlbCB9KSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMuc2l0ZU92ZXJsYXkgPSBuZXcgU2l0ZU92ZXJsYXkoKTtcblxuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICB0aGlzLnJlc3VsdHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1yZXN1bHRzXScpO1xuICAgIHRoaXMucmVzdWx0c0NvbnRhaW5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLXJlc3VsdHMtY29udGFpbmVyXScpO1xuICAgIHRoaXMuYW5pbWF0aW9uID0gdHJhbnNpdGlvbih7IGVsOiB0aGlzLnJlc3VsdHNDb250YWluZXIgfSk7XG5cbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAna2V5dXAnLCBlID0+IHRoaXMuX29uS2V5VXAoZSkpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UoKCkgPT4gdGhpcy5fb25SZXNpemUoKSwgMjUwKSk7XG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5lbCwgJ3N1Ym1pdCcsIGUgPT4gdGhpcy5fb25TdWJtaXQoZSkpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuaW5wdXQsICdpbnB1dCcsIHRoZW1lVXRpbHMuZGVib3VuY2UoKCkgPT4gdGhpcy5fb25DaGFuZ2UoKSwgMjUwKSk7XG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5pbnB1dCwgJ2ZvY3VzJywgKCkgPT4gdGhpcy5fb25Gb2N1cygpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmlucHV0LCAna2V5ZG93bicsIGUgPT4gdGhpcy5fb25LZXlkb3duKGUpKTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGRvY3VtZW50LmJvZHksICdjbGljaycsIGUgPT4ge1xuICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zZWFyY2gtZm9ybV0nKSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2dldFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0LnZhbHVlLnRyaW0oKTtcbiAgfVxuXG4gIF9vbkNoYW5nZSgpIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5fZ2V0UXVlcnkoKTtcblxuICAgIGlmICghc2VhcmNoVGVybS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0U2VhcmNoUmVzdWx0cyhzZWFyY2hUZXJtKTtcbiAgfVxuXG4gIF9vbkJsdXIoKSB7XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkZvY3VzKCkge1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLl9nZXRRdWVyeSgpO1xuXG4gICAgaWYgKCFzZWFyY2hUZXJtLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZ2V0U2VhcmNoUmVzdWx0cyhzZWFyY2hUZXJtKTtcbiAgfVxuXG4gIF9vblN1Ym1pdChlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRRdWVyeSgpLmxlbmd0aCkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgX29uS2V5VXAoZSkge1xuICAgIGlmIChlLmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmlucHV0LnZhbHVlID0gJyc7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9vbktleWRvd24oZSkge1xuICAgIC8vIFByZXZlbnQgdGhlIGN1cnNvciBmcm9tIG1vdmluZyBpbiB0aGUgaW5wdXQgd2hlbiB1c2luZyB0aGUgdXAgYW5kIGRvd24gYXJyb3cga2V5c1xuICAgIGlmIChlLmNvZGUgPT09ICdBcnJvd1VwJyB8fCBlLmNvZGUgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgX29uUmVzaXplKCkge1xuICAgIHRoaXMuX3Jlc2l6ZVNlYXJjaFJlc3VsdHMoKTtcblxuICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSB7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRTZWFyY2hSZXN1bHRzKHNlYXJjaFRlcm0pIHtcbiAgICB0aGlzLnJlc3VsdHNDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnLCAndHJ1ZScpO1xuXG4gICAgZmV0Y2goYCR7d2luZG93LlRoZW1lLnJvdXRlcy5wcmVkaWN0aXZlX3NlYXJjaF91cmx9P3E9JHtlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoVGVybSl9JnNlY3Rpb25faWQ9cHJlZGljdGl2ZS1zZWFyY2hgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0c01hcmt1cCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQvaHRtbCcpLnF1ZXJ5U2VsZWN0b3IoJyNzaG9waWZ5LXNlY3Rpb24tcHJlZGljdGl2ZS1zZWFyY2gnKS5pbm5lckhUTUw7XG4gICAgICAgIHRoaXMuX3JlbmRlclNlYXJjaFJlc3VsdHMocmVzdWx0c01hcmt1cCk7XG4gICAgICAgIHJpbWcud2F0Y2godGhpcy5yZXN1bHRzKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9XG5cbiAgX3JlZ2lzdGVyRXZlbnRzKCkge1xuICAgIHRoaXMuc2VhcmNoQnV0dG9uID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcmVkaWN0aXZlLXNlYXJjaC1idXR0b25dJyk7XG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5zZWFyY2hCdXR0b24sICdibHVyJywgKCkgPT4gdGhpcy5fb25CbHVyKCkpO1xuICB9XG5cbiAgX3Jlc2l6ZVNlYXJjaFJlc3VsdHMoKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gMzA7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHBvc2l0aW9uLmJvdHRvbSAtIG9mZnNldDtcblxuICAgIHRoaXMucmVzdWx0c0NvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1yZXN1bHRzLWNvbnRhaW5lci1oZWlnaHQnLCBgJHttYXhIZWlnaHR9cHhgKTtcbiAgfVxuXG4gIF9yZW5kZXJTZWFyY2hSZXN1bHRzKHJlc3VsdHNNYXJrdXApIHtcbiAgICB0aGlzLnJlc3VsdHNDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnLCAnZmFsc2UnKTtcbiAgICB0aGlzLnJlc3VsdHMuaW5uZXJIVE1MID0gcmVzdWx0c01hcmt1cDtcblxuICAgIHRoaXMuX29wZW4oKTtcbiAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuICAgIHRoaXMuX3Jlc2l6ZVNlYXJjaFJlc3VsdHMoKTtcbiAgfVxuXG4gIF9vcGVuKCkge1xuICAgIGlmICh0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuYW5pbWF0aW9uLmFuaW1hdGVUbygnb3BlbicpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsLWxvY2tlZCcpO1xuICAgICAgICB0aGlzLnNpdGVPdmVybGF5Lm9wZW4oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgX2Nsb3NlKCkge1xuICAgIGlmICghdGhpcy5pc09wZW4pIHJldHVybjtcblxuICAgIHRoaXMuYW5pbWF0aW9uLmFuaW1hdGVUbygnY2xvc2VkJylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgICAgIHRoaXMuc2l0ZU92ZXJsYXkuY2xvc2UoKTtcbiAgICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5KQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/PredictiveSearch.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/Product.js":
+/*!**********************************************!*\
+ !*** ./source/scripts/components/Product.js ***!
+ \**********************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Product)\n/* harmony export */ });\n/* harmony import */ var morphdom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! morphdom */ \"./node_modules/morphdom/dist/morphdom-esm.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_complementary_products__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @pixelunion/pxs-complementary-products */ \"./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @pixelunion/shopify-surface-pick-up */ \"./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_gift_card_recipient_form__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @pixelunion/pxs-gift-card-recipient-form */ \"./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js\");\n/* harmony import */ var _helpers_VariantHelper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../helpers/VariantHelper */ \"./source/scripts/helpers/VariantHelper.js\");\n/* harmony import */ var _ProductGallery__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ProductGallery */ \"./source/scripts/components/ProductGallery.js\");\n/* harmony import */ var _RTE__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RTE */ \"./source/scripts/components/RTE.js\");\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Select */ \"./source/scripts/components/Select.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Modal */ \"./source/scripts/components/Modal.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass Product {\n constructor(el, options, sectionId) {\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n this.positionProductInfo = this.positionProductInfo.bind(this);\n this.el = el;\n this.surfacePickUp = new _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_5__.default(this.el.querySelector('[data-surface-pick-up]'));\n this.surfacePickUp.onModalRequest(contents => {\n this.modal = new _Modal__WEBPACK_IMPORTED_MODULE_12__.default({\n el: this.el.querySelector('[data-modal-id=\"surface-pick-up\"]'),\n callbacks: {\n onOpen: ({\n modal\n }) => {\n const modalHeader = modal.querySelector('[data-modal-header]');\n const modalContents = modal.querySelector('[data-modal-contents]');\n\n if (this.product && this.variantHelpers) {\n const variant = this.variantHelpers.getVariantFromOptions(this.variantHelpers.getCurrentOptions());\n modalHeader.innerHTML = `<h2 class=\"surface-pick-up-modal__header\">${this.product.title}</h2><span class=\"surface-pick-up-modal__subtitle\">${variant.title}</span>`;\n }\n\n modalContents.innerHTML = contents;\n }\n }\n }, {\n reposition: false\n });\n this.modal.open();\n this.modal.showModal();\n });\n this.recipientFormEl = this.el.querySelector('[data-recipient-form]');\n\n if (this.recipientFormEl) {\n this.recipientForm = new _pixelunion_pxs_gift_card_recipient_form__WEBPACK_IMPORTED_MODULE_6__.default(this.el);\n } // Set up conditional options\n\n\n this.product = options.product;\n this.productSettings = options.product_settings;\n this.labels = JSON.parse(document.querySelector('[data-product-success-labels]').innerHTML);\n this.imagesLayout = options.images_layout;\n this.isQuickshop = options.isQuickshop;\n this.enableZoom = options.enable_zoom;\n this.enableVideoAutoplay = options.enable_video_autoplay;\n this.enableVideoLooping = options.enable_video_looping;\n this.enableCartRedirection = options.enable_cart_redirection;\n this.enableFixedPositioning = options.enable_fixed_positioning;\n this.productRecommendationLimit = options.product_recommendation_limit;\n this.variantHelpers = null;\n this.productMasonryLayout = null;\n this.rteViews = [];\n this.selectViews = [];\n this.productForm = this.el.querySelector('[data-product-form]');\n this.productContainer = this.el.querySelector('.product');\n this.productImages = this.el.querySelector('.product-images');\n this.productDetailsWrapper = this.el.querySelector('.product-details-wrapper');\n this.productDetails = this.el.querySelector('.product-details');\n this.productMessages = this.el.querySelector('.product-message');\n this.addToCartBtn = this.el.querySelector('.add-to-cart');\n this.productQuantityInput = this.el.querySelector('[data-product-quantity-input]');\n this.images = JSON.parse(this.el.querySelector('[data-images]').innerText);\n this.smallGallery = _themeUtils__WEBPACK_IMPORTED_MODULE_11__.default.isSmall();\n this.productGallery = null;\n this.unitPrice = this.el.querySelector('[data-unit-price]');\n this.taxLine = this.el.querySelector('[data-tax-line]');\n this.complementaryProductsEl = this.el.querySelector('[data-complementary-products]');\n if (!this.product) return;\n\n this._initProductGallery();\n\n this.reloadGallery = this._reloadGallery.bind(this);\n window.addEventListener('resize', this.reloadGallery);\n this.el.querySelectorAll('.rte').forEach(rte => this.rteViews.push(new _RTE__WEBPACK_IMPORTED_MODULE_9__.default({\n el: rte\n })));\n this.el.querySelectorAll('select').forEach(select => {\n if (!select.hasAttribute('data-select-ignore')) {\n this.selectViews.push(new _Select__WEBPACK_IMPORTED_MODULE_10__.default({\n el: select\n }));\n }\n });\n this.setupVariants();\n\n if (this.enableFixedPositioning) {\n this.positionProductInfo();\n }\n\n if (this.addToCartBtn) {\n this.addToCartBtn.addEventListener('click', event => this.addToCart(event));\n }\n\n if (Shopify.PaymentButton != null) {\n Shopify.PaymentButton.init();\n }\n\n if (this.complementaryProductsEl) {\n this.complementaryProductRecommendations = new _pixelunion_pxs_complementary_products__WEBPACK_IMPORTED_MODULE_3__.default({\n sectionEl: this.el,\n sectionId,\n productId: this.product.id,\n productRecommendationsRoute: window.Theme.routes.product_recommendations_url,\n includeIndicatorDots: true,\n limit: this.productRecommendationLimit\n });\n }\n }\n\n _initProductGallery() {\n this.productGallery = new _ProductGallery__WEBPACK_IMPORTED_MODULE_8__.default(this.el.querySelector('[data-product-gallery]'), {\n product_container: this.productContainer,\n images_layout: this.imagesLayout,\n images_json: this.images,\n enable_zoom: this.enableZoom,\n enable_video_looping: this.enableVideoLooping,\n enable_video_autoplay: this.enableVideoAutoplay,\n isQuickshop: this.isQuickshop\n });\n }\n\n _reloadGallery() {\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_11__.default.isSmall() && !this.smallGallery) {\n this.productGallery.unload();\n this.productGallery = null;\n\n this._initProductGallery();\n\n this.smallGallery = true;\n }\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_11__.default.isSmall() && this.smallGallery) {\n this.productGallery.unload();\n this.productGallery = null;\n\n this._initProductGallery();\n\n this.smallGallery = false;\n }\n }\n\n unload() {\n clearTimeout(this.positionTimeout);\n\n if (this.variantHelpers != null) {\n this.variantHelpers.unload();\n }\n\n if (this.productGallery) {\n this.productGallery.unload();\n }\n\n if (this.rteViews.length > 0) {\n this.rteViews = [];\n }\n\n if (this.selectViews.length > 0) {\n this.selectViews = [];\n }\n\n window.removeEventListener('resize', this.reloadGallery);\n }\n\n setupVariants() {\n const event = document.createEvent('Event');\n const variantDropdowns = this.el.querySelectorAll('[data-option-select]');\n this.variantHelpers = new _helpers_VariantHelper__WEBPACK_IMPORTED_MODULE_7__.default({\n addToCartButton: this.el.querySelector('.add-to-cart'),\n priceFields: this.el.querySelectorAll('.product-price'),\n productForm: this.el.querySelector('[data-product-form]'),\n productGallery: this.productGallery,\n productThumbnails: this.el.querySelectorAll('.product-thumbnails img'),\n selector: variantDropdowns,\n type: 'select',\n productJSON: this.product,\n productSettings: this.productSettings,\n unitPrice: this.unitPrice,\n taxLine: this.taxLine,\n quantityInput: this.productQuantityInput\n });\n this.variantHelpers.onVariantChange(v => {\n const id = v ? v.id : null;\n this.surfacePickUp.load(id);\n });\n\n if (variantDropdowns.length) {\n event.initEvent('change', true, true);\n variantDropdowns.forEach(variantDropdown => variantDropdown.dispatchEvent(event));\n } else {\n this.surfacePickUp.load(this.product.variants[0].id);\n }\n }\n\n positionProductInfo() {\n const detailsHeight = this.productDetails.getBoundingClientRect().height;\n let viewportHeight = window.innerHeight;\n\n if (document.documentElement.clientHeight < window.innerHeight) {\n viewportHeight = document.documentElement.clientHeight;\n }\n\n if (window.innerWidth > 770 && viewportHeight > detailsHeight) {\n this.triggerFixedProductInfo();\n } else {\n this.productDetails.classList.remove('product-details-fixed');\n this.productDetails.classList.remove('product-details-absolute');\n }\n\n return requestAnimationFrame(this.positionProductInfo);\n }\n\n triggerFixedProductInfo() {\n if (this.imagesLayout !== 'list') {\n return;\n }\n\n const {\n scrollTop\n } = window;\n const {\n height: imagesHeight,\n top: imagesOffsetTop\n } = this.productImages.getBoundingClientRect();\n const imagesOffsetBottom = imagesOffsetTop + imagesHeight;\n const detailsWrapperOffset = this.productDetailsWrapper.getBoundingClientRect().top;\n let {\n height: detailsHeight,\n top: detailsOffsetTop\n } = this.productDetails.getBoundingClientRect();\n let detailsOffsetBottom = detailsOffsetTop + detailsHeight;\n\n if (detailsHeight < imagesHeight) {\n // If we're far enough down the page that the content is near the window top\n if (detailsWrapperOffset - scrollTop < 0) {\n // Check if our details / images are out of line but low enough to \"fix\"\n if (detailsOffsetBottom < imagesOffsetBottom || scrollTop < detailsOffsetTop) {\n this.productDetails.classList.remove('product-details-absolute');\n this.productDetails.classList.add('product-details-fixed');\n }\n\n ({\n height: detailsHeight,\n top: detailsOffsetTop\n } = this.productDetails.getBoundingClientRect());\n detailsOffsetBottom = detailsOffsetTop + detailsHeight; // If we're far enough down then this positions items near the bottom\n\n if (detailsOffsetBottom >= imagesOffsetBottom || scrollTop >= detailsOffsetTop) {\n this.productDetails.classList.remove('product-details-fixed');\n this.productDetails.classList.add('product-details-absolute');\n }\n } else {\n this.productDetails.classList.remove('product-details-fixed');\n this.productDetails.classList.remove('product-details-absolute');\n }\n }\n }\n\n addToCart(e) {\n if (this.enableCartRedirection) {\n return;\n } // Reload the cart page when a product is added to the cart\n\n\n if (!document.body.classList.contains('template-cart')) {\n e.preventDefault();\n }\n\n if (this.recipientFormEl) {\n this.recipientFormEl.classList.remove('recipient-form--has-errors');\n }\n\n this.productMessages.innerHTML = '';\n const formData = new FormData(this.productForm);\n fetch(`${window.Theme.routes.cart_add_url}.js`, {\n method: 'POST',\n body: formData,\n headers: {\n 'X-Requested-With': 'XMLHttpRequest'\n }\n }).then(response => {\n if (!response.ok) {\n const error = new Error();\n error.response = response;\n throw error;\n }\n\n return response.json();\n }).then(item => {\n if (!item) return;\n const message = window.Theme.addToCartSuccess.replace('**product**', item.title).replace('**cart_link**', `<a href=\"${window.Theme.routes.cart_url}\">${this.labels.cartLink}</a>`).replace('**continue_link**', `<a href=\"${window.Theme.routes.all_products_collection_url}\">${this.labels.continueLink}</a>`).replace('**checkout_link**', `<button type=\"submit\" name=\"checkout\" form=\"checkout_form\">${this.labels.checkoutLink}</button>`);\n setTimeout(() => {\n this.productMessages.innerHTML = message;\n this.productMessages.classList.add('success-message');\n this.productMessages.classList.remove('error-message');\n this.updateCart(item);\n }, 500);\n }).catch(error => this.handleErrors(error));\n }\n\n updateCart() {\n document.querySelector('.mini-cart').classList.remove('empty');\n const miniCartItemWrapper = document.querySelector('.mini-cart-item-wrapper');\n const cartCount = document.querySelectorAll('.cart-count-number');\n _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_2__.default.load(window.Theme.routes.cart_url, {\n view: 'mini-ajax'\n }).then(({\n data,\n html\n }) => {\n const updatedMiniCart = document.createElement('div');\n updatedMiniCart.innerHTML = html.miniCart;\n cartCount.forEach(el => el.innerText = data.itemCount);\n (0,morphdom__WEBPACK_IMPORTED_MODULE_0__.default)(miniCartItemWrapper, updatedMiniCart.querySelector('.mini-cart-item-wrapper'), {\n onBeforeElUpdated: (fromEl, toEl) => {\n if (fromEl.tagName === 'IMG' && fromEl.src === toEl.src) {\n return false;\n }\n\n return true;\n }\n });\n });\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__.default.watch(miniCartItemWrapper);\n }\n\n handleErrors(error) {\n error.response.json().then(err => setTimeout(() => {\n if (err.errors && err.errors.email) {\n this.recipientFormEl.classList.add('recipient-form--has-errors');\n } else {\n this.productMessages.innerHTML = err.description;\n this.productMessages.classList.add('error-message');\n this.productMessages.classList.remove('success-message');\n }\n }, 1000));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9Qcm9kdWN0LmpzP2FjOGYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vcnBoZG9tIGZyb20gJ21vcnBoZG9tJztcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcbmltcG9ydCBBc3luY1ZpZXcgZnJvbSAnQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcnO1xuaW1wb3J0IENvbXBsZW1lbnRhcnlQcm9kdWN0cyBmcm9tICdAcGl4ZWx1bmlvbi9weHMtY29tcGxlbWVudGFyeS1wcm9kdWN0cyc7XG5pbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IFNob3BpZnlTdXJmYWNlUGlja1VwIGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktc3VyZmFjZS1waWNrLXVwJztcbmltcG9ydCBSZWNpcGllbnRGb3JtIGZyb20gJ0BwaXhlbHVuaW9uL3B4cy1naWZ0LWNhcmQtcmVjaXBpZW50LWZvcm0nO1xuaW1wb3J0IFZhcmlhbnRIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9WYXJpYW50SGVscGVyJztcbmltcG9ydCBQcm9kdWN0R2FsbGVyeSBmcm9tICcuL1Byb2R1Y3RHYWxsZXJ5JztcbmltcG9ydCBSVEUgZnJvbSAnLi9SVEUnO1xuaW1wb3J0IFNlbGVjdCBmcm9tICcuL1NlbGVjdCc7XG5pbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcbmltcG9ydCBNb2RhbCBmcm9tICcuL01vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdCB7XG4gIGNvbnN0cnVjdG9yKGVsLCBvcHRpb25zLCBzZWN0aW9uSWQpIHtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLnBvc2l0aW9uUHJvZHVjdEluZm8gPSB0aGlzLnBvc2l0aW9uUHJvZHVjdEluZm8uYmluZCh0aGlzKTtcbiAgICB0aGlzLmVsID0gZWw7XG5cbiAgICB0aGlzLnN1cmZhY2VQaWNrVXAgPSBuZXcgU2hvcGlmeVN1cmZhY2VQaWNrVXAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdXJmYWNlLXBpY2stdXBdJykpO1xuICAgIHRoaXMuc3VyZmFjZVBpY2tVcC5vbk1vZGFsUmVxdWVzdChjb250ZW50cyA9PiB7XG4gICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKFxuICAgICAgICB7XG4gICAgICAgICAgZWw6IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtaWQ9XCJzdXJmYWNlLXBpY2stdXBcIl0nKSxcbiAgICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIG9uT3BlbjogKHsgbW9kYWwgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtb2RhbEhlYWRlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLWhlYWRlcl0nKTtcbiAgICAgICAgICAgICAgY29uc3QgbW9kYWxDb250ZW50cyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLWNvbnRlbnRzXScpO1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3QgJiYgdGhpcy52YXJpYW50SGVscGVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRIZWxwZXJzLmdldFZhcmlhbnRGcm9tT3B0aW9ucyh0aGlzLnZhcmlhbnRIZWxwZXJzLmdldEN1cnJlbnRPcHRpb25zKCkpO1xuXG4gICAgICAgICAgICAgICAgbW9kYWxIZWFkZXIuaW5uZXJIVE1MID0gYDxoMiBjbGFzcz1cInN1cmZhY2UtcGljay11cC1tb2RhbF9faGVhZGVyXCI+JHt0aGlzLnByb2R1Y3QudGl0bGV9PC9oMj48c3BhbiBjbGFzcz1cInN1cmZhY2UtcGljay11cC1tb2RhbF9fc3VidGl0bGVcIj4ke3ZhcmlhbnQudGl0bGV9PC9zcGFuPmA7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBtb2RhbENvbnRlbnRzLmlubmVySFRNTCA9IGNvbnRlbnRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVwb3NpdGlvbjogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5tb2RhbC5vcGVuKCk7XG4gICAgICB0aGlzLm1vZGFsLnNob3dNb2RhbCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWNpcGllbnRGb3JtRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtXScpO1xuXG4gICAgaWYgKHRoaXMucmVjaXBpZW50Rm9ybUVsKSB7XG4gICAgICB0aGlzLnJlY2lwaWVudEZvcm0gPSBuZXcgUmVjaXBpZW50Rm9ybSh0aGlzLmVsKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgY29uZGl0aW9uYWwgb3B0aW9uc1xuICAgIHRoaXMucHJvZHVjdCA9IG9wdGlvbnMucHJvZHVjdDtcbiAgICB0aGlzLnByb2R1Y3RTZXR0aW5ncyA9IG9wdGlvbnMucHJvZHVjdF9zZXR0aW5ncztcbiAgICB0aGlzLmxhYmVscyA9IEpTT04ucGFyc2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1zdWNjZXNzLWxhYmVsc10nKS5pbm5lckhUTUwpO1xuICAgIHRoaXMuaW1hZ2VzTGF5b3V0ID0gb3B0aW9ucy5pbWFnZXNfbGF5b3V0O1xuICAgIHRoaXMuaXNRdWlja3Nob3AgPSBvcHRpb25zLmlzUXVpY2tzaG9wO1xuICAgIHRoaXMuZW5hYmxlWm9vbSA9IG9wdGlvbnMuZW5hYmxlX3pvb207XG4gICAgdGhpcy5lbmFibGVWaWRlb0F1dG9wbGF5ID0gb3B0aW9ucy5lbmFibGVfdmlkZW9fYXV0b3BsYXk7XG4gICAgdGhpcy5lbmFibGVWaWRlb0xvb3BpbmcgPSBvcHRpb25zLmVuYWJsZV92aWRlb19sb29waW5nO1xuICAgIHRoaXMuZW5hYmxlQ2FydFJlZGlyZWN0aW9uID0gb3B0aW9ucy5lbmFibGVfY2FydF9yZWRpcmVjdGlvbjtcbiAgICB0aGlzLmVuYWJsZUZpeGVkUG9zaXRpb25pbmcgPSBvcHRpb25zLmVuYWJsZV9maXhlZF9wb3NpdGlvbmluZztcbiAgICB0aGlzLnByb2R1Y3RSZWNvbW1lbmRhdGlvbkxpbWl0ID0gb3B0aW9ucy5wcm9kdWN0X3JlY29tbWVuZGF0aW9uX2xpbWl0O1xuXG4gICAgdGhpcy52YXJpYW50SGVscGVycyA9IG51bGw7XG4gICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCA9IG51bGw7XG4gICAgdGhpcy5ydGVWaWV3cyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0Vmlld3MgPSBbXTtcblxuICAgIHRoaXMucHJvZHVjdEZvcm0gPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtZm9ybV0nKTtcbiAgICB0aGlzLnByb2R1Y3RDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0Jyk7XG4gICAgdGhpcy5wcm9kdWN0SW1hZ2VzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1pbWFnZXMnKTtcbiAgICB0aGlzLnByb2R1Y3REZXRhaWxzV3JhcHBlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZGV0YWlscy13cmFwcGVyJyk7XG4gICAgdGhpcy5wcm9kdWN0RGV0YWlscyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZGV0YWlscycpO1xuICAgIHRoaXMucHJvZHVjdE1lc3NhZ2VzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1tZXNzYWdlJyk7XG4gICAgdGhpcy5hZGRUb0NhcnRCdG4gPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5hZGQtdG8tY2FydCcpO1xuICAgIHRoaXMucHJvZHVjdFF1YW50aXR5SW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtcXVhbnRpdHktaW5wdXRdJyk7XG4gICAgdGhpcy5pbWFnZXMgPSBKU09OLnBhcnNlKHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaW1hZ2VzXScpLmlubmVyVGV4dCk7XG4gICAgdGhpcy5zbWFsbEdhbGxlcnkgPSB0aGVtZVV0aWxzLmlzU21hbGwoKTtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5ID0gbnVsbDtcbiAgICB0aGlzLnVuaXRQcmljZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdW5pdC1wcmljZV0nKTtcbiAgICB0aGlzLnRheExpbmUgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRheC1saW5lXScpO1xuICAgIHRoaXMuY29tcGxlbWVudGFyeVByb2R1Y3RzRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbXBsZW1lbnRhcnktcHJvZHVjdHNdJyk7XG5cbiAgICBpZiAoIXRoaXMucHJvZHVjdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5faW5pdFByb2R1Y3RHYWxsZXJ5KCk7XG5cbiAgICB0aGlzLnJlbG9hZEdhbGxlcnkgPSB0aGlzLl9yZWxvYWRHYWxsZXJ5LmJpbmQodGhpcyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVsb2FkR2FsbGVyeSk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ydGUnKS5mb3JFYWNoKHJ0ZSA9PiB0aGlzLnJ0ZVZpZXdzLnB1c2gobmV3IFJURSh7IGVsOiBydGUgfSkpKTtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2goc2VsZWN0ID0+IHtcbiAgICAgIGlmICghc2VsZWN0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1zZWxlY3QtaWdub3JlJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RWaWV3cy5wdXNoKG5ldyBTZWxlY3QoeyBlbDogc2VsZWN0IH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dXBWYXJpYW50cygpO1xuXG4gICAgaWYgKHRoaXMuZW5hYmxlRml4ZWRQb3NpdGlvbmluZykge1xuICAgICAgdGhpcy5wb3NpdGlvblByb2R1Y3RJbmZvKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWRkVG9DYXJ0QnRuKSB7XG4gICAgICB0aGlzLmFkZFRvQ2FydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuYWRkVG9DYXJ0KGV2ZW50KSk7XG4gICAgfVxuXG4gICAgaWYgKFNob3BpZnkuUGF5bWVudEJ1dHRvbiAhPSBudWxsKSB7XG4gICAgICBTaG9waWZ5LlBheW1lbnRCdXR0b24uaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBsZW1lbnRhcnlQcm9kdWN0c0VsKSB7XG4gICAgICB0aGlzLmNvbXBsZW1lbnRhcnlQcm9kdWN0UmVjb21tZW5kYXRpb25zID0gbmV3IENvbXBsZW1lbnRhcnlQcm9kdWN0cyh7XG4gICAgICAgIHNlY3Rpb25FbDogdGhpcy5lbCxcbiAgICAgICAgc2VjdGlvbklkLFxuICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC5pZCxcbiAgICAgICAgcHJvZHVjdFJlY29tbWVuZGF0aW9uc1JvdXRlOiB3aW5kb3cuVGhlbWUucm91dGVzLnByb2R1Y3RfcmVjb21tZW5kYXRpb25zX3VybCxcbiAgICAgICAgaW5jbHVkZUluZGljYXRvckRvdHM6IHRydWUsXG4gICAgICAgIGxpbWl0OiB0aGlzLnByb2R1Y3RSZWNvbW1lbmRhdGlvbkxpbWl0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2luaXRQcm9kdWN0R2FsbGVyeSgpIHtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5ID0gbmV3IFByb2R1Y3RHYWxsZXJ5KFxuICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnldJyksXG4gICAgICB7XG4gICAgICAgIHByb2R1Y3RfY29udGFpbmVyOiB0aGlzLnByb2R1Y3RDb250YWluZXIsXG4gICAgICAgIGltYWdlc19sYXlvdXQ6IHRoaXMuaW1hZ2VzTGF5b3V0LFxuICAgICAgICBpbWFnZXNfanNvbjogdGhpcy5pbWFnZXMsXG4gICAgICAgIGVuYWJsZV96b29tOiB0aGlzLmVuYWJsZVpvb20sXG4gICAgICAgIGVuYWJsZV92aWRlb19sb29waW5nOiB0aGlzLmVuYWJsZVZpZGVvTG9vcGluZyxcbiAgICAgICAgZW5hYmxlX3ZpZGVvX2F1dG9wbGF5OiB0aGlzLmVuYWJsZVZpZGVvQXV0b3BsYXksXG4gICAgICAgIGlzUXVpY2tzaG9wOiB0aGlzLmlzUXVpY2tzaG9wLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgX3JlbG9hZEdhbGxlcnkoKSB7XG4gICAgaWYgKHRoZW1lVXRpbHMuaXNTbWFsbCgpICYmICF0aGlzLnNtYWxsR2FsbGVyeSkge1xuICAgICAgdGhpcy5wcm9kdWN0R2FsbGVyeS51bmxvYWQoKTtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnkgPSBudWxsO1xuICAgICAgdGhpcy5faW5pdFByb2R1Y3RHYWxsZXJ5KCk7XG4gICAgICB0aGlzLnNtYWxsR2FsbGVyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzU21hbGwoKSAmJiB0aGlzLnNtYWxsR2FsbGVyeSkge1xuICAgICAgdGhpcy5wcm9kdWN0R2FsbGVyeS51bmxvYWQoKTtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnkgPSBudWxsO1xuICAgICAgdGhpcy5faW5pdFByb2R1Y3RHYWxsZXJ5KCk7XG4gICAgICB0aGlzLnNtYWxsR2FsbGVyeSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5wb3NpdGlvblRpbWVvdXQpO1xuXG4gICAgaWYgKHRoaXMudmFyaWFudEhlbHBlcnMgIT0gbnVsbCkge1xuICAgICAgdGhpcy52YXJpYW50SGVscGVycy51bmxvYWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZHVjdEdhbGxlcnkpIHtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnkudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucnRlVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5ydGVWaWV3cyA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdFZpZXdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Vmlld3MgPSBbXTtcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVsb2FkR2FsbGVyeSk7XG4gIH1cblxuICBzZXR1cFZhcmlhbnRzKCkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgY29uc3QgdmFyaWFudERyb3Bkb3ducyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtb3B0aW9uLXNlbGVjdF0nKTtcblxuICAgIHRoaXMudmFyaWFudEhlbHBlcnMgPSBuZXcgVmFyaWFudEhlbHBlcih7XG4gICAgICBhZGRUb0NhcnRCdXR0b246IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmFkZC10by1jYXJ0JyksXG4gICAgICBwcmljZUZpZWxkczogdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1wcmljZScpLFxuICAgICAgcHJvZHVjdEZvcm06IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1mb3JtXScpLFxuICAgICAgcHJvZHVjdEdhbGxlcnk6IHRoaXMucHJvZHVjdEdhbGxlcnksXG4gICAgICBwcm9kdWN0VGh1bWJuYWlsczogdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC10aHVtYm5haWxzIGltZycpLFxuICAgICAgc2VsZWN0b3I6IHZhcmlhbnREcm9wZG93bnMsXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIHByb2R1Y3RKU09OOiB0aGlzLnByb2R1Y3QsXG4gICAgICBwcm9kdWN0U2V0dGluZ3M6IHRoaXMucHJvZHVjdFNldHRpbmdzLFxuICAgICAgdW5pdFByaWNlOiB0aGlzLnVuaXRQcmljZSxcbiAgICAgIHRheExpbmU6IHRoaXMudGF4TGluZSxcbiAgICAgIHF1YW50aXR5SW5wdXQ6IHRoaXMucHJvZHVjdFF1YW50aXR5SW5wdXQsXG4gICAgfSk7XG4gICAgdGhpcy52YXJpYW50SGVscGVycy5vblZhcmlhbnRDaGFuZ2UodiA9PiB7XG4gICAgICBjb25zdCBpZCA9IHYgPyB2LmlkIDogbnVsbDtcblxuICAgICAgdGhpcy5zdXJmYWNlUGlja1VwLmxvYWQoaWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHZhcmlhbnREcm9wZG93bnMubGVuZ3RoKSB7XG4gICAgICBldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuICAgICAgdmFyaWFudERyb3Bkb3ducy5mb3JFYWNoKHZhcmlhbnREcm9wZG93biA9PiB2YXJpYW50RHJvcGRvd24uZGlzcGF0Y2hFdmVudChldmVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cmZhY2VQaWNrVXAubG9hZCh0aGlzLnByb2R1Y3QudmFyaWFudHNbMF0uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHBvc2l0aW9uUHJvZHVjdEluZm8oKSB7XG4gICAgY29uc3QgZGV0YWlsc0hlaWdodCA9IHRoaXMucHJvZHVjdERldGFpbHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGxldCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICB2aWV3cG9ydEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHdpbmRvdy5pbm5lcldpZHRoID4gNzcwKVxuICAgICAgJiYgKHZpZXdwb3J0SGVpZ2h0ID4gZGV0YWlsc0hlaWdodClcbiAgICApIHtcbiAgICAgIHRoaXMudHJpZ2dlckZpeGVkUHJvZHVjdEluZm8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9kdWN0RGV0YWlscy5jbGFzc0xpc3QucmVtb3ZlKCdwcm9kdWN0LWRldGFpbHMtZml4ZWQnKTtcbiAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LnJlbW92ZSgncHJvZHVjdC1kZXRhaWxzLWFic29sdXRlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnBvc2l0aW9uUHJvZHVjdEluZm8pO1xuICB9XG5cbiAgdHJpZ2dlckZpeGVkUHJvZHVjdEluZm8oKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VzTGF5b3V0ICE9PSAnbGlzdCcpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gd2luZG93O1xuICAgIGNvbnN0IHsgaGVpZ2h0OiBpbWFnZXNIZWlnaHQsIHRvcDogaW1hZ2VzT2Zmc2V0VG9wIH0gPSB0aGlzLnByb2R1Y3RJbWFnZXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaW1hZ2VzT2Zmc2V0Qm90dG9tID0gaW1hZ2VzT2Zmc2V0VG9wICsgaW1hZ2VzSGVpZ2h0O1xuICAgIGNvbnN0IGRldGFpbHNXcmFwcGVyT2Zmc2V0ID0gdGhpcy5wcm9kdWN0RGV0YWlsc1dyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIGxldCB7IGhlaWdodDogZGV0YWlsc0hlaWdodCwgdG9wOiBkZXRhaWxzT2Zmc2V0VG9wIH0gPSB0aGlzLnByb2R1Y3REZXRhaWxzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkZXRhaWxzT2Zmc2V0Qm90dG9tID0gZGV0YWlsc09mZnNldFRvcCArIGRldGFpbHNIZWlnaHQ7XG5cbiAgICBpZiAoZGV0YWlsc0hlaWdodCA8IGltYWdlc0hlaWdodCkge1xuICAgICAgLy8gSWYgd2UncmUgZmFyIGVub3VnaCBkb3duIHRoZSBwYWdlIHRoYXQgdGhlIGNvbnRlbnQgaXMgbmVhciB0aGUgd2luZG93IHRvcFxuICAgICAgaWYgKChkZXRhaWxzV3JhcHBlck9mZnNldCAtIHNjcm9sbFRvcCkgPCAwKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBkZXRhaWxzIC8gaW1hZ2VzIGFyZSBvdXQgb2YgbGluZSBidXQgbG93IGVub3VnaCB0byBcImZpeFwiXG4gICAgICAgIGlmICgoZGV0YWlsc09mZnNldEJvdHRvbSA8IGltYWdlc09mZnNldEJvdHRvbSkgfHwgKHNjcm9sbFRvcCA8IGRldGFpbHNPZmZzZXRUb3ApKSB7XG4gICAgICAgICAgdGhpcy5wcm9kdWN0RGV0YWlscy5jbGFzc0xpc3QucmVtb3ZlKCdwcm9kdWN0LWRldGFpbHMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxzLmNsYXNzTGlzdC5hZGQoJ3Byb2R1Y3QtZGV0YWlscy1maXhlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgKHsgaGVpZ2h0OiBkZXRhaWxzSGVpZ2h0LCB0b3A6IGRldGFpbHNPZmZzZXRUb3AgfSA9IHRoaXMucHJvZHVjdERldGFpbHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICBkZXRhaWxzT2Zmc2V0Qm90dG9tID0gZGV0YWlsc09mZnNldFRvcCArIGRldGFpbHNIZWlnaHQ7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgZmFyIGVub3VnaCBkb3duIHRoZW4gdGhpcyBwb3NpdGlvbnMgaXRlbXMgbmVhciB0aGUgYm90dG9tXG4gICAgICAgIGlmICgoZGV0YWlsc09mZnNldEJvdHRvbSA+PSBpbWFnZXNPZmZzZXRCb3R0b20pIHx8IChzY3JvbGxUb3AgPj0gZGV0YWlsc09mZnNldFRvcCkpIHtcbiAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxzLmNsYXNzTGlzdC5yZW1vdmUoJ3Byb2R1Y3QtZGV0YWlscy1maXhlZCcpO1xuICAgICAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LmFkZCgncHJvZHVjdC1kZXRhaWxzLWFic29sdXRlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LnJlbW92ZSgncHJvZHVjdC1kZXRhaWxzLWZpeGVkJyk7XG4gICAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LnJlbW92ZSgncHJvZHVjdC1kZXRhaWxzLWFic29sdXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVG9DYXJ0KGUpIHtcbiAgICBpZiAodGhpcy5lbmFibGVDYXJ0UmVkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWxvYWQgdGhlIGNhcnQgcGFnZSB3aGVuIGEgcHJvZHVjdCBpcyBhZGRlZCB0byB0aGUgY2FydFxuICAgIGlmICghZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3RlbXBsYXRlLWNhcnQnKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlY2lwaWVudEZvcm1FbCkge1xuICAgICAgdGhpcy5yZWNpcGllbnRGb3JtRWwuY2xhc3NMaXN0LnJlbW92ZSgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5pbm5lckhUTUwgPSAnJztcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKHRoaXMucHJvZHVjdEZvcm0pO1xuXG4gICAgZmV0Y2goXG4gICAgICBgJHt3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfYWRkX3VybH0uanNgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oaXRlbSA9PiB7XG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gd2luZG93LlRoZW1lLmFkZFRvQ2FydFN1Y2Nlc3NcbiAgICAgICAgICAucmVwbGFjZSgnKipwcm9kdWN0KionLCBpdGVtLnRpdGxlKVxuICAgICAgICAgIC5yZXBsYWNlKCcqKmNhcnRfbGluayoqJywgYDxhIGhyZWY9XCIke3dpbmRvdy5UaGVtZS5yb3V0ZXMuY2FydF91cmx9XCI+JHt0aGlzLmxhYmVscy5jYXJ0TGlua308L2E+YClcbiAgICAgICAgICAucmVwbGFjZSgnKipjb250aW51ZV9saW5rKionLCBgPGEgaHJlZj1cIiR7d2luZG93LlRoZW1lLnJvdXRlcy5hbGxfcHJvZHVjdHNfY29sbGVjdGlvbl91cmx9XCI+JHt0aGlzLmxhYmVscy5jb250aW51ZUxpbmt9PC9hPmApXG4gICAgICAgICAgLnJlcGxhY2UoJyoqY2hlY2tvdXRfbGluayoqJywgYDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJjaGVja291dFwiIGZvcm09XCJjaGVja291dF9mb3JtXCI+JHt0aGlzLmxhYmVscy5jaGVja291dExpbmt9PC9idXR0b24+YCk7XG5cbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5pbm5lckhUTUwgPSBtZXNzYWdlO1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0TWVzc2FnZXMuY2xhc3NMaXN0LmFkZCgnc3VjY2Vzcy1tZXNzYWdlJyk7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5jbGFzc0xpc3QucmVtb3ZlKCdlcnJvci1tZXNzYWdlJyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnQoaXRlbSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICA1MDAsXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuaGFuZGxlRXJyb3JzKGVycm9yKSk7XG4gIH1cblxuICB1cGRhdGVDYXJ0KCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5taW5pLWNhcnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdlbXB0eScpO1xuICAgIGNvbnN0IG1pbmlDYXJ0SXRlbVdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWluaS1jYXJ0LWl0ZW0td3JhcHBlcicpO1xuICAgIGNvbnN0IGNhcnRDb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJ0LWNvdW50LW51bWJlcicpO1xuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfdXJsLFxuICAgICAgeyB2aWV3OiAnbWluaS1hamF4JyB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IGRhdGEsIGh0bWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkTWluaUNhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdXBkYXRlZE1pbmlDYXJ0LmlubmVySFRNTCA9IGh0bWwubWluaUNhcnQ7XG4gICAgICAgIGNhcnRDb3VudC5mb3JFYWNoKGVsID0+IGVsLmlubmVyVGV4dCA9IGRhdGEuaXRlbUNvdW50KTtcblxuICAgICAgICBtb3JwaGRvbShcbiAgICAgICAgICBtaW5pQ2FydEl0ZW1XcmFwcGVyLFxuICAgICAgICAgIHVwZGF0ZWRNaW5pQ2FydC5xdWVyeVNlbGVjdG9yKCcubWluaS1jYXJ0LWl0ZW0td3JhcHBlcicpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmcm9tRWwudGFnTmFtZSA9PT0gJ0lNRycgJiYgZnJvbUVsLnNyYyA9PT0gdG9FbC5zcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHJpbWcud2F0Y2gobWluaUNhcnRJdGVtV3JhcHBlcik7XG4gIH1cblxuICBoYW5kbGVFcnJvcnMoZXJyb3IpIHtcbiAgICBlcnJvci5yZXNwb25zZS5qc29uKCkudGhlbihlcnIgPT4gc2V0VGltZW91dChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKGVyci5lcnJvcnMgJiYgZXJyLmVycm9ycy5lbWFpbCkge1xuICAgICAgICAgIHRoaXMucmVjaXBpZW50Rm9ybUVsLmNsYXNzTGlzdC5hZGQoJ3JlY2lwaWVudC1mb3JtLS1oYXMtZXJyb3JzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9kdWN0TWVzc2FnZXMuaW5uZXJIVE1MID0gZXJyLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIHRoaXMucHJvZHVjdE1lc3NhZ2VzLmNsYXNzTGlzdC5hZGQoJ2Vycm9yLW1lc3NhZ2UnKTtcbiAgICAgICAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5jbGFzc0xpc3QucmVtb3ZlKCdzdWNjZXNzLW1lc3NhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIDEwMDAsXG4gICAgKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUZBO0FBa0JBO0FBREE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBY0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQU5BO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFoV0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/Product.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/ProductGallery.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/components/ProductGallery.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ProductGallery)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _vimeo_player__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vimeo/player */ \"./node_modules/@vimeo/player/dist/player.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _ImageZoom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageZoom */ \"./source/scripts/components/ImageZoom.js\");\n/* harmony import */ var _helpers_youtubeIframeAPIHelper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers/youtubeIframeAPIHelper */ \"./source/scripts/helpers/youtubeIframeAPIHelper.js\");\n/* harmony import */ var _ProductSlideshow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ProductSlideshow */ \"./source/scripts/components/ProductSlideshow.js\");\n/* harmony import */ var _MasonryGrid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\n\n\n\n\n\n\n\nclass ProductGallery {\n constructor(el, settings) {\n this.el = el;\n this.initialGallery = this.el.innerHTML;\n this.settings = settings;\n this.layout = this.el.dataset.productGalleryLayout;\n this.productContainer = this.settings.product_container;\n this.media = [];\n this.models = {};\n this.players = [];\n this.flickityEvents = [];\n this.pageDots = null;\n this.flickityNavButtons = null;\n this.externalVideoLoaded = false;\n this.videoLoaded = false;\n this.modelLoaded = false;\n this.productMasonryLayout = null;\n this.flickity = null;\n this.viewport = this.el.querySelector('[data-product-gallery-viewport]');\n this.navigation = this.el.querySelector('[data-product-gallery-navigation]');\n this.masonryContainer = this.el.querySelector('[data-masonry-gallery]');\n this.figures = this.el.querySelectorAll('[data-product-gallery-figure]');\n this.initMasonry = this._initProductMasonry.bind(this);\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n\n if (this.viewport) {\n this.selected = {\n figure: this.viewport.querySelector('[data-product-gallery-selected=\"true\"]'),\n thumbnail: this.navigation ? this.navigation.querySelector('[data-product-gallery-selected=\"true\"]') : null\n };\n }\n\n if (this.layout !== 'masonry') {\n this._loadLibrariesAndInitMedia();\n }\n\n this._registerEvents();\n\n this._initLayout();\n }\n\n _loadLibrariesAndInitMedia() {\n const features = [];\n\n if (this.el.querySelector('[data-media-type=\"model\"]')) {\n features.push({\n name: 'model-viewer-ui',\n version: '1.0',\n onLoad: this._onModelLibraryLoad.bind(this)\n });\n features.push({\n name: 'shopify-xr',\n version: '1.0'\n });\n }\n\n if (this.el.querySelector('[data-media-type=\"video\"]')) {\n Promise.all([new Promise(resolve => {\n if (!document.querySelector('#plyr-stylesheet')) {\n const link = document.createElement('link');\n link.setAttribute('id', 'plyr-stylesheet');\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('href', 'https://cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css');\n link.onload = resolve;\n document.body.appendChild(link);\n } else {\n resolve();\n }\n }), new Promise(resolve => {\n features.push({\n name: 'video-ui',\n version: '1.0',\n onLoad: resolve\n });\n })]).then(this._onVideoLibraryLoad.bind(this));\n }\n\n if (this.el.querySelector('[data-media-type=\"external_video\"]')) {\n (0,_helpers_youtubeIframeAPIHelper__WEBPACK_IMPORTED_MODULE_5__.default)().then(this._onExternalVideoLibraryLoad.bind(this));\n }\n\n if (features.length) {\n Shopify.loadFeatures(features);\n }\n }\n\n _registerEvents() {\n if (this.el.querySelector('[data-media-type=\"model\"]')) {\n this.events.register(this.viewport, 'click', e => {\n if ('shopifyXr' in e.target.dataset) {\n this._onViewInYourSpaceClick(e.target);\n }\n });\n }\n\n if (this.layout === 'masonry') {\n this.events.register(window, 'resize', e => this.initMasonry(e));\n }\n\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_3__.default.watch(this.el);\n }\n\n _initLayout() {\n if (this.layout === 'masonry') {\n this._initProductMasonry();\n } else if (this.layout === 'slideshow') {\n this.slideshow = new _ProductSlideshow__WEBPACK_IMPORTED_MODULE_6__.default({\n el: this.el\n });\n\n if (this.navigation) {\n this.thumbnails = this.navigation.querySelectorAll('[data-product-gallery-thumbnail]');\n\n this.onThumbnailClick = e => this._selectMediaByIndex(e.currentTarget.dataset.productGalleryThumbnail);\n\n this.thumbnails.forEach(thumbnail => this.events.register(thumbnail, 'click', this.onThumbnailClick));\n }\n\n if (this.settings.enable_zoom && this.el.querySelectorAll('[data-media-type=\"image\"]').length > 0) {\n this.zoomView = new _ImageZoom__WEBPACK_IMPORTED_MODULE_4__.default({\n viewport: this.viewport,\n images: this.settings.images_json\n });\n }\n }\n }\n\n selectMediaByVariant(variant) {\n if (!variant || !variant.featured_media) return;\n\n if (this.slideshow) {\n const figure = this.viewport.querySelector(`[data-media=\"${variant.featured_media.id}\"]`);\n this.slideshow.selectThumbnail(variant.featured_media.id);\n\n this._selectMediaByIndex(figure.dataset.productGalleryFigure);\n } else if (this.flickity) {\n const slideIndex = this.el.querySelector(`[data-media=\"${variant.featured_media.id}\"]`).dataset.productGalleryFigure;\n this.flickity.select(parseInt(slideIndex, 10));\n }\n }\n\n unload() {\n this.events.unregisterAll();\n this.media.forEach(m => m.unload());\n this.media = [];\n\n if (this.productMasonryLayout) {\n this.productMasonryLayout.unload();\n this.productMasonryLayout = null;\n }\n\n if (this.flickity) {\n this.flickity.destroy();\n this.flickity = null;\n this.flickityEvents = [];\n }\n\n if (this.imageZoom) {\n this.imageZoom.unload();\n }\n\n this.el.innerHTML = this.initialGallery;\n }\n\n _onModelLibraryLoad() {\n if (!Shopify.ModelViewerUI) return;\n if (this.modelLoaded) return;\n this.el.querySelectorAll('[data-media-type=\"model\"]').forEach(figure => {\n const controls = ['zoom-in', 'zoom-out'];\n const {\n productGalleryFigure\n } = figure.dataset;\n if (document.fullscreenEnabled) controls.push('fullscreen');\n\n const onPlayListener = () => {\n if (this.flickity) {\n this.flickity.unbindDrag();\n }\n };\n\n const onPauseListener = () => {\n if (this.flickity) {\n this.flickity.bindDrag();\n }\n };\n\n const modelViewer = figure.querySelector('model-viewer');\n\n if (modelViewer) {\n const player = new Shopify.ModelViewerUI(figure.querySelector('model-viewer'), {\n controls\n });\n this.models[productGalleryFigure] = player;\n this.media.push({\n type: 'model',\n figure,\n player,\n focus: () => {},\n restart: () => {},\n pause: () => player.pause(),\n play: () => player.play(),\n unload: () => {}\n });\n\n if (this.flickity) {\n this.events.register(modelViewer, 'shopify_model_viewer_ui_toggle_play', onPlayListener);\n this.events.register(modelViewer, 'shopify_model_viewer_ui_toggle_pause', onPauseListener);\n this.flickity.resize();\n }\n }\n });\n\n if (this.productMasonryLayout) {\n this.productMasonryLayout.layout();\n }\n\n this.modelLoaded = true;\n }\n\n _onViewInYourSpaceClick(target) {\n if (target.dataset.shopifyModel3dId === this.selected.figure.dataset.media) return;\n const figure = this.viewport.querySelector(`[data-media=\"${target.dataset.shopifyModel3dId}\"]`);\n\n this._selectMediaByEl(figure);\n }\n\n _selectMediaByEl(el) {\n this._selectMediaByIndex(parseInt(el.dataset.productGalleryFigure, 10));\n }\n\n _onVideoLibraryLoad() {\n if (!Shopify.Plyr) return;\n if (this.videoLoaded && this.settings.isQuickshop) return;\n const videoFigures = this.el.querySelectorAll('[data-media-type=\"video\"]');\n\n for (let i = 0; i < videoFigures.length; i++) {\n const videoFigure = videoFigures[i];\n const player = new Shopify.Plyr(videoFigure.querySelector('video'), {\n loop: {\n active: this.settings.enable_video_looping\n }\n });\n const plyrEl = videoFigure.querySelector('.plyr');\n const video = {\n type: 'video',\n figure: videoFigure,\n player,\n focus: () => plyrEl.focus(),\n restart: () => {\n player.restart();\n player.play();\n },\n pause: () => player.pause(),\n play: () => player.play(),\n unload: () => player.destroy()\n };\n this.events.register(videoFigure, 'play', () => this._pauseMedia(video));\n this.media.push(video);\n\n if (this.flickity) {\n this.flickity.resize();\n }\n }\n\n if (this.productMasonryLayout && this.settings.isQuickshop) {\n setTimeout(() => {\n this.productMasonryLayout.layout();\n }, 100);\n } else if (this.productMasonryLayout && !this.settings.isQuickshop) {\n this.productMasonryLayout.layout();\n }\n\n this.videoLoaded = true;\n }\n\n _onExternalVideoLibraryLoad() {\n if (this.externalVideoLoaded && this.settings.isQuickshop) return;\n const videoFigures = this.el.querySelectorAll('figure[data-media-type=\"external_video\"]');\n\n for (let i = 0; i < videoFigures.length; i++) {\n const videoFigure = videoFigures[i];\n const videoIframe = videoFigure.querySelector('iframe');\n const iframeSrc = videoIframe.src;\n let video;\n\n if (iframeSrc.includes('youtube')) {\n const player = new YT.Player(videoIframe);\n video = {\n type: 'video',\n figure: videoFigure,\n player,\n focus: () => player.getIframe().focus(),\n restart: () => {\n player.seekTo(0);\n player.playVideo();\n },\n pause: () => player.pauseVideo(),\n play: () => {\n videoFigure.classList.add('video-playing');\n player.playVideo();\n },\n unload: () => player.destroy()\n }; // `player` is a Youtube Player instance so we want to add this event using the JS API,\n // not using our own Events library. It will be removed when the player this media is\n // unloaded and the player's `destroy` method is called.\n\n player.addEventListener('onStateChange', ({\n data\n }) => {\n if (data === YT.PlayerState.ENDED && this.settings.enable_video_looping) {\n video.restart();\n } else if (data === YT.PlayerState.PLAYING) {\n this._pauseMedia(video);\n }\n });\n } else {\n const player = new _vimeo_player__WEBPACK_IMPORTED_MODULE_2__.default(videoIframe);\n player.setLoop(this.settings.enable_video_looping);\n video = {\n type: 'video',\n figure: videoFigure,\n player,\n focus: () => videoIframe.focus(),\n restart: () => {\n player.setCurrentTime(0);\n player.play();\n },\n pause: () => player.pause(),\n play: () => player.play(),\n unload: () => player.unload()\n };\n }\n\n this.media.push(video);\n\n if (this.flickity) {\n this.flickity.resize();\n }\n }\n\n if (this.productMasonryLayout && this.settings.isQuickshop) {\n setTimeout(() => {\n this.productMasonryLayout.layout();\n }, 100);\n } else if (this.productMasonryLayout && !this.settings.isQuickshop) {\n this.productMasonryLayout.layout();\n }\n\n this.externalVideoLoaded = true;\n }\n\n _onMediaSelect(media) {\n if (!media) return;\n\n switch (media.type) {\n case 'video':\n media.focus();\n\n if (this.settings.enable_video_autoplay && !_themeUtils__WEBPACK_IMPORTED_MODULE_8__.default.isSmall() && this.layout !== 'list' && this.layout !== 'masonry') {\n media.play();\n }\n\n break;\n\n case 'model':\n if (document.querySelector('html').classList.contains('no-touch')) {\n media.play();\n }\n\n break;\n\n default:\n break;\n }\n }\n\n _pauseMedia(excludeMedia = null) {\n this.media.forEach(m => {\n if (m !== excludeMedia) {\n m.pause();\n }\n });\n }\n\n _selectMediaByIndex(index) {\n if (this.layout !== 'slideshow') return;\n const figure = this.figures[index];\n this.selected.figure.dataset.productGallerySelected = false;\n this.selected.figure.setAttribute('aria-hidden', true);\n this.selected.figure = figure;\n this.selected.figure.dataset.productGallerySelected = true;\n this.selected.figure.setAttribute('aria-hidden', false);\n\n if (this.navigation) {\n const thumbnail = this.thumbnails[index];\n this.selected.thumbnail.dataset.productGallerySelected = false;\n this.selected.thumbnail = thumbnail;\n this.selected.thumbnail.dataset.productGallerySelected = true;\n }\n\n this._pauseMedia();\n\n this._onMediaSelect(this.media.filter(m => m.figure === this.selected.figure)[0]);\n\n if (this.zoomView && figure.dataset.mediaType === 'image') {\n this.zoomView.prepareZoom(true);\n }\n }\n\n _initProductMasonry(e) {\n if (e && document.fullscreenElement) {\n return;\n } else if (e && !document.fullscreenElement) {\n if (this.productMasonryLayout) {\n this.productMasonryLayout.layout();\n }\n }\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_8__.default.isSmall()) {\n if (this.productMasonryLayout) {\n this.unload();\n this.el.setAttribute('style', '');\n\n this._registerEvents();\n }\n\n if (!this.flickity) {\n this._initProductFlickity();\n }\n } else {\n if (this.flickity) {\n this.unload();\n this.el.setAttribute('style', '');\n\n this._registerEvents();\n }\n\n if (!this.productMasonryLayout) {\n if (this.figures.length > 1) {\n this.productMasonryLayout = new _MasonryGrid__WEBPACK_IMPORTED_MODULE_7__.default({\n el: this.el,\n settings: {\n itemSelector: '.product-gallery--viewport--figure',\n columnWidth: '[data-masonry-image-sizer]'\n }\n });\n }\n\n this._loadLibrariesAndInitMedia();\n }\n\n if (this.productMasonryLayout && this.settings.isQuickshop) {\n setTimeout(() => {\n this.productMasonryLayout.layout();\n }, 100);\n } else if (this.productMasonryLayout && !this.settings.isQuickshop) {\n this.productMasonryLayout.layout();\n }\n }\n }\n\n _selectFlickitySlide(el) {\n if (el.hasAttribute('data-mobile-slider-button')) {\n if (el.dataset.mobileSliderButton === 'next') {\n this.flickity.next();\n } else {\n this.flickity.previous();\n }\n }\n\n if (el.hasAttribute('data-mobile-slider-dot')) {\n this.flickity.select(parseInt(el.dataset.slideDotIndex, 10));\n }\n\n this._pauseMedia();\n\n this._onMediaSelect(this.media.filter(m => m.figure === this.flickity.selectedElement)[0]);\n }\n\n _selectFlickityNav() {\n this.pageDots.forEach(dotEl => {\n if (parseInt(dotEl.dataset.slideDotIndex, 10) === this.flickity.selectedIndex) {\n dotEl.classList.add('selected');\n } else {\n dotEl.classList.remove('selected');\n }\n });\n this.flickityNavButtons.forEach(navEl => {\n if (navEl.dataset.mobileSliderButton === 'prev' && this.flickity.selectedIndex === 0) {\n navEl.disabled = true;\n } else if (navEl.dataset.mobileSliderButton === 'next' && this.flickity.selectedIndex === this.flickity.slides.length - 1) {\n navEl.disabled = true;\n } else {\n navEl.disabled = false;\n }\n });\n }\n\n _initProductFlickity() {\n if (this.figures.length <= 1) return;\n\n if (!this.flickity) {\n this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_1___default())(this.el, {\n cellAlign: 'left',\n cellSelector: '.product-gallery--viewport--figure',\n contain: true,\n percentPosition: false,\n prevNextButtons: true,\n adaptiveHeight: true,\n setGallerySize: true,\n pageDots: true,\n lazyLoad: false\n });\n this.pageDots = this.productContainer.querySelectorAll('[data-mobile-slider-dot]');\n this.flickityNavButtons = this.productContainer.querySelectorAll('[data-mobile-slider-button]');\n this.flickity.on('select', () => this._selectFlickityNav());\n this.flickityNavButtons.forEach(el => {\n this.flickityEvents.push(this.events.register(el, 'click', () => this._selectFlickitySlide(el)));\n });\n this.pageDots.forEach(el => {\n this.flickityEvents.push(this.events.register(el, 'click', () => this._selectFlickitySlide(el)));\n });\n this.flickityEvents.push(this.events.register(this.el, 'rimg:load', () => this.flickity.resize())); // Flickity controls the pointerdown event which prevents model-viewer-ui from\n // triggering .play() on mouseup. This returns this functionality.\n\n this.flickity.on('staticClick', (event, pointer, cellElement) => {\n const figure = cellElement;\n\n if (figure && this.models[figure.dataset.productGalleryFigure]) {\n const model = this.models[figure.dataset.productGalleryFigure];\n model.play();\n }\n });\n }\n\n this._loadLibrariesAndInitMedia();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RHYWxsZXJ5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdEdhbGxlcnkuanM/MWMwZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IFZpbWVvIGZyb20gJ0B2aW1lby9wbGF5ZXInO1xuaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcbmltcG9ydCBJbWFnZVpvb20gZnJvbSAnLi9JbWFnZVpvb20nO1xuaW1wb3J0IGxvYWRZb3V0dWJlSWZyYW1lQVBJIGZyb20gJy4uL2hlbHBlcnMveW91dHViZUlmcmFtZUFQSUhlbHBlcic7XG5pbXBvcnQgUHJvZHVjdFNsaWRlc2hvdyBmcm9tICcuL1Byb2R1Y3RTbGlkZXNob3cnO1xuaW1wb3J0IE1hc29ucnlHcmlkIGZyb20gJy4vTWFzb25yeUdyaWQnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RHYWxsZXJ5IHtcbiAgY29uc3RydWN0b3IoZWwsIHNldHRpbmdzKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuaW5pdGlhbEdhbGxlcnkgPSB0aGlzLmVsLmlubmVySFRNTDtcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5sYXlvdXQgPSB0aGlzLmVsLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlMYXlvdXQ7XG4gICAgdGhpcy5wcm9kdWN0Q29udGFpbmVyID0gdGhpcy5zZXR0aW5ncy5wcm9kdWN0X2NvbnRhaW5lcjtcbiAgICB0aGlzLm1lZGlhID0gW107XG4gICAgdGhpcy5tb2RlbHMgPSB7fTtcbiAgICB0aGlzLnBsYXllcnMgPSBbXTtcbiAgICB0aGlzLmZsaWNraXR5RXZlbnRzID0gW107XG4gICAgdGhpcy5wYWdlRG90cyA9IG51bGw7XG4gICAgdGhpcy5mbGlja2l0eU5hdkJ1dHRvbnMgPSBudWxsO1xuICAgIHRoaXMuZXh0ZXJuYWxWaWRlb0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMudmlkZW9Mb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCA9IG51bGw7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnktdmlld3BvcnRdJyk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnktbmF2aWdhdGlvbl0nKTtcbiAgICB0aGlzLm1hc29ucnlDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hc29ucnktZ2FsbGVyeV0nKTtcbiAgICB0aGlzLmZpZ3VyZXMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeS1maWd1cmVdJyk7XG5cbiAgICB0aGlzLmluaXRNYXNvbnJ5ID0gdGhpcy5faW5pdFByb2R1Y3RNYXNvbnJ5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cbiAgICBpZiAodGhpcy52aWV3cG9ydCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHtcbiAgICAgICAgZmlndXJlOiB0aGlzLnZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeS1zZWxlY3RlZD1cInRydWVcIl0nKSxcbiAgICAgICAgdGh1bWJuYWlsOiB0aGlzLm5hdmlnYXRpb24gPyB0aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1nYWxsZXJ5LXNlbGVjdGVkPVwidHJ1ZVwiXScpIDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGF5b3V0ICE9PSAnbWFzb25yeScpIHtcbiAgICAgIHRoaXMuX2xvYWRMaWJyYXJpZXNBbmRJbml0TWVkaWEoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuICAgIHRoaXMuX2luaXRMYXlvdXQoKTtcbiAgfVxuXG4gIF9sb2FkTGlicmFyaWVzQW5kSW5pdE1lZGlhKCkge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tZWRpYS10eXBlPVwibW9kZWxcIl0nKSkge1xuICAgICAgZmVhdHVyZXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdtb2RlbC12aWV3ZXItdWknLFxuICAgICAgICAgIHZlcnNpb246ICcxLjAnLFxuICAgICAgICAgIG9uTG9hZDogdGhpcy5fb25Nb2RlbExpYnJhcnlMb2FkLmJpbmQodGhpcyksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgZmVhdHVyZXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdzaG9waWZ5LXhyJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWVkaWEtdHlwZT1cInZpZGVvXCJdJykpIHtcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGx5ci1zdHlsZXNoZWV0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG5cbiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpZCcsICdwbHlyLXN0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpO1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vc2hvcGlmeWNsb3VkL3Nob3BpZnktcGx5ci92MS4wL3Nob3BpZnktcGx5ci5jc3MnKTtcbiAgICAgICAgICAgIGxpbmsub25sb2FkID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBmZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6ICd2aWRlby11aScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgICAgIG9uTG9hZDogcmVzb2x2ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICBdKS50aGVuKHRoaXMuX29uVmlkZW9MaWJyYXJ5TG9hZC5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tZWRpYS10eXBlPVwiZXh0ZXJuYWxfdmlkZW9cIl0nKSkge1xuICAgICAgbG9hZFlvdXR1YmVJZnJhbWVBUEkoKS50aGVuKHRoaXMuX29uRXh0ZXJuYWxWaWRlb0xpYnJhcnlMb2FkLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgIFNob3BpZnkubG9hZEZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICB9XG4gIH1cblxuICBfcmVnaXN0ZXJFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWVkaWEtdHlwZT1cIm1vZGVsXCJdJykpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMudmlld3BvcnQsICdjbGljaycsIGUgPT4ge1xuICAgICAgICBpZiAoJ3Nob3BpZnlYcicgaW4gZS50YXJnZXQuZGF0YXNldCkge1xuICAgICAgICAgIHRoaXMuX29uVmlld0luWW91clNwYWNlQ2xpY2soZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdtYXNvbnJ5Jykge1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAncmVzaXplJywgKGUpID0+IHRoaXMuaW5pdE1hc29ucnkoZSkpO1xuICAgIH1cblxuICAgIHJpbWcud2F0Y2godGhpcy5lbCk7XG4gIH1cblxuICBfaW5pdExheW91dCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdtYXNvbnJ5Jykge1xuICAgICAgdGhpcy5faW5pdFByb2R1Y3RNYXNvbnJ5KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxheW91dCA9PT0gJ3NsaWRlc2hvdycpIHtcbiAgICAgIHRoaXMuc2xpZGVzaG93ID0gbmV3IFByb2R1Y3RTbGlkZXNob3coeyBlbDogdGhpcy5lbCB9KTtcblxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLnRodW1ibmFpbHMgPSB0aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJvZHVjdC1nYWxsZXJ5LXRodW1ibmFpbF0nKTtcbiAgICAgICAgdGhpcy5vblRodW1ibmFpbENsaWNrID0gZSA9PiAoXG4gICAgICAgICAgdGhpcy5fc2VsZWN0TWVkaWFCeUluZGV4KGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5VGh1bWJuYWlsKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudGh1bWJuYWlscy5mb3JFYWNoKHRodW1ibmFpbCA9PiB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aHVtYm5haWwsICdjbGljaycsIHRoaXMub25UaHVtYm5haWxDbGljaykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVfem9vbSAmJiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1lZGlhLXR5cGU9XCJpbWFnZVwiXScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy56b29tVmlldyA9IG5ldyBJbWFnZVpvb20oe1xuICAgICAgICAgIHZpZXdwb3J0OiB0aGlzLnZpZXdwb3J0LFxuICAgICAgICAgIGltYWdlczogdGhpcy5zZXR0aW5ncy5pbWFnZXNfanNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0TWVkaWFCeVZhcmlhbnQodmFyaWFudCkge1xuICAgIGlmICghdmFyaWFudCB8fCAhdmFyaWFudC5mZWF0dXJlZF9tZWRpYSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuc2xpZGVzaG93KSB7XG4gICAgICBjb25zdCBmaWd1cmUgPSB0aGlzLnZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1lZGlhPVwiJHt2YXJpYW50LmZlYXR1cmVkX21lZGlhLmlkfVwiXWApO1xuICAgICAgdGhpcy5zbGlkZXNob3cuc2VsZWN0VGh1bWJuYWlsKHZhcmlhbnQuZmVhdHVyZWRfbWVkaWEuaWQpO1xuICAgICAgdGhpcy5fc2VsZWN0TWVkaWFCeUluZGV4KGZpZ3VyZS5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5RmlndXJlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1lZGlhPVwiJHt2YXJpYW50LmZlYXR1cmVkX21lZGlhLmlkfVwiXWApLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlGaWd1cmU7XG4gICAgICB0aGlzLmZsaWNraXR5LnNlbGVjdChwYXJzZUludChzbGlkZUluZGV4LCAxMCkpO1xuICAgIH1cbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy51bnJlZ2lzdGVyQWxsKCk7XG5cbiAgICB0aGlzLm1lZGlhLmZvckVhY2gobSA9PiBtLnVubG9hZCgpKTtcbiAgICB0aGlzLm1lZGlhID0gW107XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCkge1xuICAgICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dC51bmxvYWQoKTtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgICAgdGhpcy5mbGlja2l0eUV2ZW50cyA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmltYWdlWm9vbSkge1xuICAgICAgdGhpcy5pbWFnZVpvb20udW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5pbm5lckhUTUwgPSB0aGlzLmluaXRpYWxHYWxsZXJ5O1xuICB9XG5cbiAgX29uTW9kZWxMaWJyYXJ5TG9hZCgpIHtcbiAgICBpZiAoIVNob3BpZnkuTW9kZWxWaWV3ZXJVSSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLm1vZGVsTG9hZGVkKSByZXR1cm47XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1lZGlhLXR5cGU9XCJtb2RlbFwiXScpLmZvckVhY2goZmlndXJlID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xzID0gWyd6b29tLWluJywgJ3pvb20tb3V0J107XG4gICAgICBjb25zdCB7IHByb2R1Y3RHYWxsZXJ5RmlndXJlIH0gPSBmaWd1cmUuZGF0YXNldDtcblxuICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkKSBjb250cm9scy5wdXNoKCdmdWxsc2NyZWVuJyk7XG5cbiAgICAgIGNvbnN0IG9uUGxheUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICAgIHRoaXMuZmxpY2tpdHkudW5iaW5kRHJhZygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblBhdXNlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICAgICAgdGhpcy5mbGlja2l0eS5iaW5kRHJhZygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2RlbFZpZXdlciA9IGZpZ3VyZS5xdWVyeVNlbGVjdG9yKCdtb2RlbC12aWV3ZXInKTtcblxuICAgICAgaWYgKG1vZGVsVmlld2VyKSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBTaG9waWZ5Lk1vZGVsVmlld2VyVUkoZmlndXJlLnF1ZXJ5U2VsZWN0b3IoJ21vZGVsLXZpZXdlcicpLCB7IGNvbnRyb2xzIH0pO1xuXG4gICAgICAgIHRoaXMubW9kZWxzW3Byb2R1Y3RHYWxsZXJ5RmlndXJlXSA9IHBsYXllcjtcblxuICAgICAgICB0aGlzLm1lZGlhLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdtb2RlbCcsXG4gICAgICAgICAgZmlndXJlLFxuICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICBmb2N1czogKCkgPT4ge30sXG4gICAgICAgICAgcmVzdGFydDogKCkgPT4ge30sXG4gICAgICAgICAgcGF1c2U6ICgpID0+IHBsYXllci5wYXVzZSgpLFxuICAgICAgICAgIHBsYXk6ICgpID0+IHBsYXllci5wbGF5KCksXG4gICAgICAgICAgdW5sb2FkOiAoKSA9PiB7fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihtb2RlbFZpZXdlciwgJ3Nob3BpZnlfbW9kZWxfdmlld2VyX3VpX3RvZ2dsZV9wbGF5Jywgb25QbGF5TGlzdGVuZXIpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKG1vZGVsVmlld2VyLCAnc2hvcGlmeV9tb2RlbF92aWV3ZXJfdWlfdG9nZ2xlX3BhdXNlJywgb25QYXVzZUxpc3RlbmVyKTtcbiAgICAgICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQpIHtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQubGF5b3V0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5tb2RlbExvYWRlZCA9IHRydWU7XG4gIH1cblxuICBfb25WaWV3SW5Zb3VyU3BhY2VDbGljayh0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0LmRhdGFzZXQuc2hvcGlmeU1vZGVsM2RJZCA9PT0gdGhpcy5zZWxlY3RlZC5maWd1cmUuZGF0YXNldC5tZWRpYSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlndXJlID0gdGhpcy52aWV3cG9ydC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tZWRpYT1cIiR7dGFyZ2V0LmRhdGFzZXQuc2hvcGlmeU1vZGVsM2RJZH1cIl1gKTtcbiAgICB0aGlzLl9zZWxlY3RNZWRpYUJ5RWwoZmlndXJlKTtcbiAgfVxuXG4gIF9zZWxlY3RNZWRpYUJ5RWwoZWwpIHtcbiAgICB0aGlzLl9zZWxlY3RNZWRpYUJ5SW5kZXgocGFyc2VJbnQoZWwuZGF0YXNldC5wcm9kdWN0R2FsbGVyeUZpZ3VyZSwgMTApKTtcbiAgfVxuXG4gIF9vblZpZGVvTGlicmFyeUxvYWQoKSB7XG4gICAgaWYgKCFTaG9waWZ5LlBseXIpIHJldHVybjtcbiAgICBpZiAodGhpcy52aWRlb0xvYWRlZCAmJiB0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSByZXR1cm47XG5cbiAgICBjb25zdCB2aWRlb0ZpZ3VyZXMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1lZGlhLXR5cGU9XCJ2aWRlb1wiXScpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlb0ZpZ3VyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZpZGVvRmlndXJlID0gdmlkZW9GaWd1cmVzW2ldO1xuICAgICAgY29uc3QgcGxheWVyID0gbmV3IFNob3BpZnkuUGx5cihcbiAgICAgICAgdmlkZW9GaWd1cmUucXVlcnlTZWxlY3RvcigndmlkZW8nKSxcbiAgICAgICAge1xuICAgICAgICAgIGxvb3A6IHsgYWN0aXZlOiB0aGlzLnNldHRpbmdzLmVuYWJsZV92aWRlb19sb29waW5nIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwbHlyRWwgPSB2aWRlb0ZpZ3VyZS5xdWVyeVNlbGVjdG9yKCcucGx5cicpO1xuXG4gICAgICBjb25zdCB2aWRlbyA9IHtcbiAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgZmlndXJlOiB2aWRlb0ZpZ3VyZSxcbiAgICAgICAgcGxheWVyLFxuICAgICAgICBmb2N1czogKCkgPT4gcGx5ckVsLmZvY3VzKCksXG4gICAgICAgIHJlc3RhcnQ6ICgpID0+IHtcbiAgICAgICAgICBwbGF5ZXIucmVzdGFydCgpO1xuICAgICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdXNlOiAoKSA9PiBwbGF5ZXIucGF1c2UoKSxcbiAgICAgICAgcGxheTogKCkgPT4gcGxheWVyLnBsYXkoKSxcbiAgICAgICAgdW5sb2FkOiAoKSA9PiBwbGF5ZXIuZGVzdHJveSgpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodmlkZW9GaWd1cmUsICdwbGF5JywgKCkgPT4gdGhpcy5fcGF1c2VNZWRpYSh2aWRlbykpO1xuXG4gICAgICB0aGlzLm1lZGlhLnB1c2godmlkZW8pO1xuXG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ICYmIHRoaXMuc2V0dGluZ3MuaXNRdWlja3Nob3ApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQgJiYgIXRoaXMuc2V0dGluZ3MuaXNRdWlja3Nob3ApIHtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQubGF5b3V0KCk7XG4gICAgfVxuXG4gICAgdGhpcy52aWRlb0xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBfb25FeHRlcm5hbFZpZGVvTGlicmFyeUxvYWQoKSB7XG4gICAgaWYgKHRoaXMuZXh0ZXJuYWxWaWRlb0xvYWRlZCAmJiB0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSByZXR1cm47XG5cbiAgICBjb25zdCB2aWRlb0ZpZ3VyZXMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ZpZ3VyZVtkYXRhLW1lZGlhLXR5cGU9XCJleHRlcm5hbF92aWRlb1wiXScpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlb0ZpZ3VyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZpZGVvRmlndXJlID0gdmlkZW9GaWd1cmVzW2ldO1xuICAgICAgY29uc3QgdmlkZW9JZnJhbWUgPSB2aWRlb0ZpZ3VyZS5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IHZpZGVvSWZyYW1lLnNyYztcbiAgICAgIGxldCB2aWRlbztcblxuICAgICAgaWYgKGlmcmFtZVNyYy5pbmNsdWRlcygneW91dHViZScpKSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBZVC5QbGF5ZXIodmlkZW9JZnJhbWUpO1xuXG4gICAgICAgIHZpZGVvID0ge1xuICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgZmlndXJlOiB2aWRlb0ZpZ3VyZSxcbiAgICAgICAgICBwbGF5ZXIsXG4gICAgICAgICAgZm9jdXM6ICgpID0+IHBsYXllci5nZXRJZnJhbWUoKS5mb2N1cygpLFxuICAgICAgICAgIHJlc3RhcnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHBsYXllci5zZWVrVG8oMCk7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXVzZTogKCkgPT4gcGxheWVyLnBhdXNlVmlkZW8oKSxcbiAgICAgICAgICBwbGF5OiAoKSA9PiB7XG4gICAgICAgICAgICB2aWRlb0ZpZ3VyZS5jbGFzc0xpc3QuYWRkKCd2aWRlby1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgIHBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVubG9hZDogKCkgPT4gcGxheWVyLmRlc3Ryb3koKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBgcGxheWVyYCBpcyBhIFlvdXR1YmUgUGxheWVyIGluc3RhbmNlIHNvIHdlIHdhbnQgdG8gYWRkIHRoaXMgZXZlbnQgdXNpbmcgdGhlIEpTIEFQSSxcbiAgICAgICAgLy8gbm90IHVzaW5nIG91ciBvd24gRXZlbnRzIGxpYnJhcnkuIEl0IHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBwbGF5ZXIgdGhpcyBtZWRpYSBpc1xuICAgICAgICAvLyB1bmxvYWRlZCBhbmQgdGhlIHBsYXllcidzIGBkZXN0cm95YCBtZXRob2QgaXMgY2FsbGVkLlxuICAgICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignb25TdGF0ZUNoYW5nZScsICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhID09PSBZVC5QbGF5ZXJTdGF0ZS5FTkRFRCAmJiB0aGlzLnNldHRpbmdzLmVuYWJsZV92aWRlb19sb29waW5nKSB7XG4gICAgICAgICAgICB2aWRlby5yZXN0YXJ0KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBZVC5QbGF5ZXJTdGF0ZS5QTEFZSU5HKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZU1lZGlhKHZpZGVvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gbmV3IFZpbWVvKHZpZGVvSWZyYW1lKTtcbiAgICAgICAgcGxheWVyLnNldExvb3AodGhpcy5zZXR0aW5ncy5lbmFibGVfdmlkZW9fbG9vcGluZyk7XG5cbiAgICAgICAgdmlkZW8gPSB7XG4gICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICBmaWd1cmU6IHZpZGVvRmlndXJlLFxuICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICBmb2N1czogKCkgPT4gdmlkZW9JZnJhbWUuZm9jdXMoKSxcbiAgICAgICAgICByZXN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgICBwbGF5ZXIuc2V0Q3VycmVudFRpbWUoMCk7XG4gICAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF1c2U6ICgpID0+IHBsYXllci5wYXVzZSgpLFxuICAgICAgICAgIHBsYXk6ICgpID0+IHBsYXllci5wbGF5KCksXG4gICAgICAgICAgdW5sb2FkOiAoKSA9PiBwbGF5ZXIudW5sb2FkKCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aGlzLm1lZGlhLnB1c2godmlkZW8pO1xuXG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCAmJiB0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dC5sYXlvdXQoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ICYmICF0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSB7XG4gICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgIH1cblxuICAgIHRoaXMuZXh0ZXJuYWxWaWRlb0xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBfb25NZWRpYVNlbGVjdChtZWRpYSkge1xuICAgIGlmICghbWVkaWEpIHJldHVybjtcblxuICAgIHN3aXRjaCAobWVkaWEudHlwZSkge1xuICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICBtZWRpYS5mb2N1cygpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5lbmFibGVfdmlkZW9fYXV0b3BsYXlcbiAgICAgICAgICAmJiAhdGhlbWVVdGlscy5pc1NtYWxsKClcbiAgICAgICAgICAmJiB0aGlzLmxheW91dCAhPT0gJ2xpc3QnXG4gICAgICAgICAgJiYgdGhpcy5sYXlvdXQgIT09ICdtYXNvbnJ5J1xuICAgICAgICApIHtcbiAgICAgICAgICBtZWRpYS5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykuY2xhc3NMaXN0LmNvbnRhaW5zKCduby10b3VjaCcpKSB7XG4gICAgICAgICAgbWVkaWEucGxheSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX3BhdXNlTWVkaWEoZXhjbHVkZU1lZGlhID0gbnVsbCkge1xuICAgIHRoaXMubWVkaWEuZm9yRWFjaChtID0+IHtcbiAgICAgIGlmIChtICE9PSBleGNsdWRlTWVkaWEpIHtcbiAgICAgICAgbS5wYXVzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3NlbGVjdE1lZGlhQnlJbmRleChpbmRleCkge1xuICAgIGlmICh0aGlzLmxheW91dCAhPT0gJ3NsaWRlc2hvdycpIHJldHVybjtcblxuICAgIGNvbnN0IGZpZ3VyZSA9IHRoaXMuZmlndXJlc1tpbmRleF07XG5cbiAgICB0aGlzLnNlbGVjdGVkLmZpZ3VyZS5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkLmZpZ3VyZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZC5maWd1cmUgPSBmaWd1cmU7XG4gICAgdGhpcy5zZWxlY3RlZC5maWd1cmUuZGF0YXNldC5wcm9kdWN0R2FsbGVyeVNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkLmZpZ3VyZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgZmFsc2UpO1xuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvbikge1xuICAgICAgY29uc3QgdGh1bWJuYWlsID0gdGhpcy50aHVtYm5haWxzW2luZGV4XTtcblxuICAgICAgdGhpcy5zZWxlY3RlZC50aHVtYm5haWwuZGF0YXNldC5wcm9kdWN0R2FsbGVyeVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkLnRodW1ibmFpbCA9IHRodW1ibmFpbDtcbiAgICAgIHRoaXMuc2VsZWN0ZWQudGh1bWJuYWlsLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlTZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5fcGF1c2VNZWRpYSgpO1xuICAgIHRoaXMuX29uTWVkaWFTZWxlY3QodGhpcy5tZWRpYS5maWx0ZXIobSA9PiBtLmZpZ3VyZSA9PT0gdGhpcy5zZWxlY3RlZC5maWd1cmUpWzBdKTtcbiAgICBpZiAodGhpcy56b29tVmlldyAmJiBmaWd1cmUuZGF0YXNldC5tZWRpYVR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgIHRoaXMuem9vbVZpZXcucHJlcGFyZVpvb20odHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgX2luaXRQcm9kdWN0TWFzb25yeShlKSB7XG4gICAgaWYgKGUgJiYgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGUgJiYgIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGVtZVV0aWxzLmlzU21hbGwoKSkge1xuICAgICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQpIHtcbiAgICAgICAgdGhpcy51bmxvYWQoKTtcbiAgICAgICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZmxpY2tpdHkpIHtcbiAgICAgICAgdGhpcy5faW5pdFByb2R1Y3RGbGlja2l0eSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCkge1xuICAgICAgICBpZiAodGhpcy5maWd1cmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ID0gbmV3IE1hc29ucnlHcmlkKHtcbiAgICAgICAgICAgIGVsOiB0aGlzLmVsLFxuICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgaXRlbVNlbGVjdG9yOiAnLnByb2R1Y3QtZ2FsbGVyeS0tdmlld3BvcnQtLWZpZ3VyZScsXG4gICAgICAgICAgICAgIGNvbHVtbldpZHRoOiAnW2RhdGEtbWFzb25yeS1pbWFnZS1zaXplcl0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRMaWJyYXJpZXNBbmRJbml0TWVkaWEoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQgJiYgdGhpcy5zZXR0aW5ncy5pc1F1aWNrc2hvcCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ICYmICF0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQubGF5b3V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3NlbGVjdEZsaWNraXR5U2xpZGUoZWwpIHtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdkYXRhLW1vYmlsZS1zbGlkZXItYnV0dG9uJykpIHtcbiAgICAgIGlmIChlbC5kYXRhc2V0Lm1vYmlsZVNsaWRlckJ1dHRvbiA9PT0gJ25leHQnKSB7XG4gICAgICAgIHRoaXMuZmxpY2tpdHkubmV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mbGlja2l0eS5wcmV2aW91cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbW9iaWxlLXNsaWRlci1kb3QnKSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5zZWxlY3QocGFyc2VJbnQoZWwuZGF0YXNldC5zbGlkZURvdEluZGV4LCAxMCkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BhdXNlTWVkaWEoKTtcbiAgICB0aGlzLl9vbk1lZGlhU2VsZWN0KHRoaXMubWVkaWEuZmlsdGVyKG0gPT4gbS5maWd1cmUgPT09IHRoaXMuZmxpY2tpdHkuc2VsZWN0ZWRFbGVtZW50KVswXSk7XG4gIH1cblxuICBfc2VsZWN0RmxpY2tpdHlOYXYoKSB7XG4gICAgdGhpcy5wYWdlRG90cy5mb3JFYWNoKGRvdEVsID0+IHtcbiAgICAgIGlmIChwYXJzZUludChkb3RFbC5kYXRhc2V0LnNsaWRlRG90SW5kZXgsIDEwKSA9PT0gdGhpcy5mbGlja2l0eS5zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgIGRvdEVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5mbGlja2l0eU5hdkJ1dHRvbnMuZm9yRWFjaChuYXZFbCA9PiB7XG4gICAgICBpZiAobmF2RWwuZGF0YXNldC5tb2JpbGVTbGlkZXJCdXR0b24gPT09ICdwcmV2JyAmJiB0aGlzLmZsaWNraXR5LnNlbGVjdGVkSW5kZXggPT09IDApIHtcbiAgICAgICAgbmF2RWwuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuYXZFbC5kYXRhc2V0Lm1vYmlsZVNsaWRlckJ1dHRvbiA9PT0gJ25leHQnICYmIHRoaXMuZmxpY2tpdHkuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy5mbGlja2l0eS5zbGlkZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBuYXZFbC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYXZFbC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2luaXRQcm9kdWN0RmxpY2tpdHkoKSB7XG4gICAgaWYgKHRoaXMuZmlndXJlcy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KFxuICAgICAgICB0aGlzLmVsLFxuICAgICAgICB7XG4gICAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgY2VsbFNlbGVjdG9yOiAnLnByb2R1Y3QtZ2FsbGVyeS0tdmlld3BvcnQtLWZpZ3VyZScsXG4gICAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgICBwZXJjZW50UG9zaXRpb246IGZhbHNlLFxuICAgICAgICAgIHByZXZOZXh0QnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgICAgICBzZXRHYWxsZXJ5U2l6ZTogdHJ1ZSxcbiAgICAgICAgICBwYWdlRG90czogdHJ1ZSxcbiAgICAgICAgICBsYXp5TG9hZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICB0aGlzLnBhZ2VEb3RzID0gdGhpcy5wcm9kdWN0Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1vYmlsZS1zbGlkZXItZG90XScpO1xuICAgICAgdGhpcy5mbGlja2l0eU5hdkJ1dHRvbnMgPSB0aGlzLnByb2R1Y3RDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9iaWxlLXNsaWRlci1idXR0b25dJyk7XG5cbiAgICAgIHRoaXMuZmxpY2tpdHkub24oJ3NlbGVjdCcsICgpID0+IHRoaXMuX3NlbGVjdEZsaWNraXR5TmF2KCkpO1xuXG4gICAgICB0aGlzLmZsaWNraXR5TmF2QnV0dG9ucy5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgdGhpcy5mbGlja2l0eUV2ZW50cy5wdXNoKHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGVsLCAnY2xpY2snLCAoKSA9PiB0aGlzLl9zZWxlY3RGbGlja2l0eVNsaWRlKGVsKSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGFnZURvdHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIHRoaXMuZmxpY2tpdHlFdmVudHMucHVzaCh0aGlzLmV2ZW50cy5yZWdpc3RlcihlbCwgJ2NsaWNrJywgKCkgPT4gdGhpcy5fc2VsZWN0RmxpY2tpdHlTbGlkZShlbCkpKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZsaWNraXR5RXZlbnRzLnB1c2godGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5lbCwgJ3JpbWc6bG9hZCcsICgpID0+IHRoaXMuZmxpY2tpdHkucmVzaXplKCkpKTtcblxuICAgICAgLy8gRmxpY2tpdHkgY29udHJvbHMgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHdoaWNoIHByZXZlbnRzIG1vZGVsLXZpZXdlci11aSBmcm9tXG4gICAgICAvLyB0cmlnZ2VyaW5nIC5wbGF5KCkgb24gbW91c2V1cC4gVGhpcyByZXR1cm5zIHRoaXMgZnVuY3Rpb25hbGl0eS5cbiAgICAgIHRoaXMuZmxpY2tpdHkub24oJ3N0YXRpY0NsaWNrJywgKGV2ZW50LCBwb2ludGVyLCBjZWxsRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBmaWd1cmUgPSBjZWxsRWxlbWVudDtcblxuICAgICAgICBpZiAoZmlndXJlICYmIHRoaXMubW9kZWxzW2ZpZ3VyZS5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5RmlndXJlXSkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHNbZmlndXJlLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlGaWd1cmVdO1xuICAgICAgICAgIG1vZGVsLnBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRMaWJyYXJpZXNBbmRJbml0TWVkaWEoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBREE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBY0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFmQTtBQW1CQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQWxCQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBRkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQWFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBOWlCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductGallery.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/ProductHighVariant.js":
+/*!*********************************************************!*\
+ !*** ./source/scripts/components/ProductHighVariant.js ***!
+ \*********************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ProductHighVariant)\n/* harmony export */ });\n/* harmony import */ var morphdom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! morphdom */ \"./node_modules/morphdom/dist/morphdom-esm.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\n\n\nclass ProductHighVariant {\n constructor(el) {\n this.el = el; // Prevent cart redirection\n\n document.addEventListener('product-form:cart:navigate', event => {\n event.preventDefault();\n }); // Handle successful cart addition\n\n document.addEventListener('product-form:submit:success', () => {\n this.updateMiniCart();\n });\n }\n\n updateMiniCart() {\n document.querySelector('.mini-cart').classList.remove('empty');\n const miniCartItemWrapper = document.querySelector('.mini-cart-item-wrapper');\n const cartCount = document.querySelectorAll('.cart-count-number');\n _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__.default.load(window.Theme.routes.cart_url, {\n view: 'mini-ajax'\n }).then(({\n data,\n html\n }) => {\n const updatedMiniCart = document.createElement('div');\n updatedMiniCart.innerHTML = html.miniCart;\n cartCount.forEach(el => {\n el.innerText = data.itemCount;\n });\n (0,morphdom__WEBPACK_IMPORTED_MODULE_0__.default)(miniCartItemWrapper, updatedMiniCart.querySelector('.mini-cart-item-wrapper'), {\n onBeforeElUpdated: (fromEl, toEl) => {\n if (fromEl.tagName === 'IMG' && fromEl.src === toEl.src) {\n return false;\n }\n\n return true;\n }\n });\n });\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(miniCartItemWrapper);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RIaWdoVmFyaWFudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RIaWdoVmFyaWFudC5qcz8xMmMzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb3JwaGRvbSBmcm9tICdtb3JwaGRvbSc7XG5pbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCByaW1nIGZyb20gJ0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RIaWdoVmFyaWFudCB7XG4gIGNvbnN0cnVjdG9yKGVsKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuXG4gICAgLy8gUHJldmVudCBjYXJ0IHJlZGlyZWN0aW9uXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZHVjdC1mb3JtOmNhcnQ6bmF2aWdhdGUnLCBldmVudCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgY2FydCBhZGRpdGlvblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2R1Y3QtZm9ybTpzdWJtaXQ6c3VjY2VzcycsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTWluaUNhcnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZU1pbmlDYXJ0KCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5taW5pLWNhcnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdlbXB0eScpO1xuICAgIGNvbnN0IG1pbmlDYXJ0SXRlbVdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWluaS1jYXJ0LWl0ZW0td3JhcHBlcicpO1xuICAgIGNvbnN0IGNhcnRDb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJ0LWNvdW50LW51bWJlcicpO1xuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfdXJsLFxuICAgICAgeyB2aWV3OiAnbWluaS1hamF4JyB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IGRhdGEsIGh0bWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkTWluaUNhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdXBkYXRlZE1pbmlDYXJ0LmlubmVySFRNTCA9IGh0bWwubWluaUNhcnQ7XG4gICAgICAgIGNhcnRDb3VudC5mb3JFYWNoKGVsID0+IHsgZWwuaW5uZXJUZXh0ID0gZGF0YS5pdGVtQ291bnQ7IH0pO1xuXG4gICAgICAgIG1vcnBoZG9tKFxuICAgICAgICAgIG1pbmlDYXJ0SXRlbVdyYXBwZXIsXG4gICAgICAgICAgdXBkYXRlZE1pbmlDYXJ0LnF1ZXJ5U2VsZWN0b3IoJy5taW5pLWNhcnQtaXRlbS13cmFwcGVyJyksXG4gICAgICAgICAge1xuICAgICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGZyb21FbC50YWdOYW1lID09PSAnSU1HJyAmJiBmcm9tRWwuc3JjID09PSB0b0VsLnNyYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgcmltZy53YXRjaChtaW5pQ2FydEl0ZW1XcmFwcGVyKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBTkE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQTdDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductHighVariant.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/ProductListItem.js":
+/*!******************************************************!*\
+ !*** ./source/scripts/components/ProductListItem.js ***!
+ \******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ProductListItem)\n/* harmony export */ });\n/* harmony import */ var _Quickshop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Quickshop */ \"./source/scripts/components/Quickshop.js\");\n\nclass ProductListItem {\n constructor({\n el\n }) {\n this.el = el;\n this.el.querySelector('.product-list-item-thumbnail').addEventListener('click', event => this.redirectToProduct(event));\n this.productHover = this.el.closest('[data-product-hover]').dataset.productHover;\n this.quickshopTrigger = this.el.querySelector('.quick-shop-modal-trigger');\n\n if (this.productHover === 'quick-shop' && this.quickshopTrigger !== null) {\n this.quickshop = new _Quickshop__WEBPACK_IMPORTED_MODULE_0__.default();\n this.quickshopTrigger.addEventListener('click', event => this.openQuickShop(event));\n this.quickshopTrigger.addEventListener('mouseover', event => this.preloadQuickshop(event));\n }\n }\n\n remove() {\n if (this.quickshop) {\n this.quickshop.unload();\n this.quickshopTrigger.removeEventListener('click', event => this.openQuickShop(event));\n this.quickshopTrigger.removeEventListener('mouseover', event => this.preloadQuickshop(event));\n }\n\n this.el.querySelector('.product-list-item-thumbnail').removeEventListener('click', event => this.redirectToProduct(event));\n }\n\n redirectToProduct({\n target\n }) {\n const url = !target.classList.contains('quick-shop-modal-trigger') ? target.dataset.url : null;\n\n if (url) {\n window.location = url;\n }\n }\n\n openQuickShop(e) {\n const productUrl = e.currentTarget.getAttribute('data-product-url');\n return this.quickshop.open(productUrl);\n }\n\n preloadQuickshop(e) {\n const productUrl = e.currentTarget.getAttribute('data-product-url');\n return this.quickshop.load(productUrl);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RMaXN0SXRlbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RMaXN0SXRlbS5qcz9kNjZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBRdWlja3Nob3AgZnJvbSAnLi9RdWlja3Nob3AnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0TGlzdEl0ZW0ge1xuICBjb25zdHJ1Y3Rvcih7IGVsIH0pIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5lbFxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0LWxpc3QtaXRlbS10aHVtYm5haWwnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5yZWRpcmVjdFRvUHJvZHVjdChldmVudCkpO1xuICAgIHRoaXMucHJvZHVjdEhvdmVyID0gdGhpcy5lbC5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWhvdmVyXScpLmRhdGFzZXQucHJvZHVjdEhvdmVyO1xuICAgIHRoaXMucXVpY2tzaG9wVHJpZ2dlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnF1aWNrLXNob3AtbW9kYWwtdHJpZ2dlcicpO1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdEhvdmVyID09PSAncXVpY2stc2hvcCcgJiYgdGhpcy5xdWlja3Nob3BUcmlnZ2VyICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnF1aWNrc2hvcCA9IG5ldyBRdWlja3Nob3AoKTtcbiAgICAgIHRoaXMucXVpY2tzaG9wVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMub3BlblF1aWNrU2hvcChldmVudCkpO1xuICAgICAgdGhpcy5xdWlja3Nob3BUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGV2ZW50ID0+IHRoaXMucHJlbG9hZFF1aWNrc2hvcChldmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5xdWlja3Nob3ApIHtcbiAgICAgIHRoaXMucXVpY2tzaG9wLnVubG9hZCgpO1xuICAgICAgdGhpcy5xdWlja3Nob3BUcmlnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5vcGVuUXVpY2tTaG9wKGV2ZW50KSk7XG4gICAgICB0aGlzLnF1aWNrc2hvcFRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZXZlbnQgPT4gdGhpcy5wcmVsb2FkUXVpY2tzaG9wKGV2ZW50KSk7XG4gICAgfVxuICAgIHRoaXMuZWxcbiAgICAgIC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1saXN0LWl0ZW0tdGh1bWJuYWlsJylcbiAgICAgIC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMucmVkaXJlY3RUb1Byb2R1Y3QoZXZlbnQpKTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9Qcm9kdWN0KHsgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCB1cmwgPSAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygncXVpY2stc2hvcC1tb2RhbC10cmlnZ2VyJykgPyB0YXJnZXQuZGF0YXNldC51cmwgOiBudWxsO1xuXG4gICAgaWYgKHVybCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uID0gdXJsO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5RdWlja1Nob3AoZSkge1xuICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3QtdXJsJyk7XG4gICAgcmV0dXJuIHRoaXMucXVpY2tzaG9wLm9wZW4ocHJvZHVjdFVybCk7XG4gIH1cblxuICBwcmVsb2FkUXVpY2tzaG9wKGUpIHtcbiAgICBjb25zdCBwcm9kdWN0VXJsID0gZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LXVybCcpO1xuICAgIHJldHVybiB0aGlzLnF1aWNrc2hvcC5sb2FkKHByb2R1Y3RVcmwpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductListItem.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/ProductMasonry.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/components/ProductMasonry.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ProductMasonry)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _MasonryGrid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n\n\n\n\nclass ProductMasonry {\n constructor({\n el\n }) {\n this.el = el;\n this.selectors = {\n gallery: {\n el: '[data-masonry-gallery]',\n itemSelector: '.product-gallery--viewport--figure',\n columnWidth: '[data-masonry-image-sizer]'\n },\n relatedProducts: {\n el: '[data-masonry-products]',\n itemSelector: '.product-list-item',\n columnWidth: '[data-masonry-products-sizer]'\n }\n };\n this.masonry = {\n gallery: null,\n relatedProducts: null\n };\n this.flickity = {\n gallery: null,\n relatedProducts: null\n };\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n this.gallery = this.el.querySelector(this.selectors.gallery.el);\n this.relatedProducts = this.el.querySelector(this.selectors.relatedProducts.el);\n this.hasGallery = !!this.gallery;\n this.hasRelatedProducts = !!this.relatedProducts;\n this._initLayout = this._initLayout.bind(this);\n\n this._bindEvents();\n\n this._initLayout();\n }\n\n remove() {\n this.events.unregisterAll();\n\n if (this.flickity) {\n this._destroyFlickity();\n }\n\n if (this.masonry) {\n this._destroyMasonry();\n }\n }\n\n onSectionUnload() {\n this.remove();\n }\n\n _bindEvents() {\n this.onRimgLoadEvent = () => {\n if (this.flickity.gallery) {\n _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.flickityResize(this.flickity.gallery);\n }\n\n if (this.flickity.relatedProducts) {\n _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.flickityResize(this.flickity.relatedProducts);\n }\n };\n\n this.resizeDebouncedEvent = _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.debounce(this._initLayout, 100);\n this.events.register(window, 'resize', this.resizeDebouncedEvent);\n this.events.register(this.el, 'rimg:load', this.onRimgLoadEvent);\n }\n\n _initLayout() {\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.isSmall()) {\n this._initMobile();\n } else {\n this._initDesktop();\n }\n }\n\n _initMobile() {\n this._destroyMasonry();\n\n this._initFlickity();\n }\n\n _initDesktop() {\n this._destroyFlickity();\n\n this._initMasonry();\n }\n\n _initFlickity() {\n if (this.hasGallery && !this.flickity.gallery) {\n this._galleryReset();\n\n this.flickity.gallery = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.gallery, {\n cellAlign: 'left',\n cellSelector: this.selectors.gallery.itemSelector,\n contain: false,\n percentPosition: false,\n prevNextButtons: true,\n adaptiveHeight: true,\n pageDots: true,\n setGallerySize: false,\n lazyLoad: false\n });\n\n this._flickityEvents({\n el: this.gallery,\n flickity: this.flickity.gallery\n });\n }\n\n if (this.hasRelatedProducts && !this.flickity.relatedProducts) {\n this._relatedProductsReset();\n\n this.flickity.relatedProducts = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.relatedProducts, {\n cellAlign: 'left',\n cellSelector: this.selectors.relatedProducts.itemSelector,\n contain: true,\n prevNextButtons: false,\n pageDots: false,\n setGallerySize: false\n });\n\n this._flickityEvents({\n el: this.relatedProducts,\n flickity: this.flickity.relatedProducts\n });\n }\n }\n\n _destroyFlickity() {\n if (this.flickity.gallery) {\n this.flickity.gallery.destroy();\n this.flickity.gallery = null;\n this.events.unregister(this.onResize);\n }\n\n if (this.flickity.relatedProducts) {\n this.flickity.relatedProducts.destroy();\n this.flickity.relatedProducts = null;\n }\n }\n\n _initMasonry() {\n if (this.hasGallery && !this.masonry.gallery) {\n this._galleryReset();\n\n this.masonry.gallery = new _MasonryGrid__WEBPACK_IMPORTED_MODULE_3__.default({\n el: this.gallery,\n settings: {\n itemSelector: this.selectors.gallery.itemSelector,\n columnWidth: this.selectors.gallery.columnWidth\n }\n });\n }\n\n if (this.hasRelatedProducts && !this.masonry.relatedProducts) {\n this._relatedProductsReset();\n\n this.masonry.relatedProducts = new _MasonryGrid__WEBPACK_IMPORTED_MODULE_3__.default({\n el: this.relatedProducts,\n settings: {\n itemSelector: this.selectors.relatedProducts.itemSelector,\n columnWidth: this.selectors.relatedProducts.columnWidth\n }\n });\n }\n }\n\n _destroyMasonry() {\n if (this.masonry.gallery) {\n this.masonry.gallery.unload();\n this.masonry.gallery = null;\n }\n\n if (this.masonry.relatedProducts) {\n this.masonry.relatedProducts.unload();\n this.masonry.relatedProducts = null;\n }\n }\n\n _galleryReset() {\n this.gallery.querySelectorAll(this.selectors.gallery.itemSelector).forEach(item => item.setAttribute('style', ''));\n }\n\n _relatedProductsReset() {\n this.relatedProducts.querySelectorAll(this.selectors.relatedProducts.itemSelector).forEach(item => item.setAttribute('style', ''));\n }\n\n _flickityEvents({\n el,\n flickity\n }) {\n const event = document.createEvent('Event');\n event.initEvent('product-masonry-layout', true, true);\n\n this.flickityResizeEvent = () => _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.flickityResize(flickity);\n\n this.flickityDebouncedEvent = _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.debounce(() => el.dispatchEvent(event), 10);\n flickity.on('cellSelect', () => el.dispatchEvent(event));\n flickity.on('settle', () => el.dispatchEvent(event));\n this.events.register(el, 'product-masonry-layout', this.flickityResizeEvent); // Sets the Slider to the height of the first slide\n\n el.dispatchEvent(event);\n this.onResize = this.events.register(window, 'resize', this.flickityDebouncedEvent);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RNYXNvbnJ5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdE1hc29ucnkuanM/MTg5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5pbXBvcnQgTWFzb25yeUdyaWQgZnJvbSAnLi9NYXNvbnJ5R3JpZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RNYXNvbnJ5IHtcbiAgY29uc3RydWN0b3IoeyBlbCB9KSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuc2VsZWN0b3JzID0ge1xuICAgICAgZ2FsbGVyeToge1xuICAgICAgICBlbDogJ1tkYXRhLW1hc29ucnktZ2FsbGVyeV0nLFxuICAgICAgICBpdGVtU2VsZWN0b3I6ICcucHJvZHVjdC1nYWxsZXJ5LS12aWV3cG9ydC0tZmlndXJlJyxcbiAgICAgICAgY29sdW1uV2lkdGg6ICdbZGF0YS1tYXNvbnJ5LWltYWdlLXNpemVyXScsXG4gICAgICB9LFxuICAgICAgcmVsYXRlZFByb2R1Y3RzOiB7XG4gICAgICAgIGVsOiAnW2RhdGEtbWFzb25yeS1wcm9kdWN0c10nLFxuICAgICAgICBpdGVtU2VsZWN0b3I6ICcucHJvZHVjdC1saXN0LWl0ZW0nLFxuICAgICAgICBjb2x1bW5XaWR0aDogJ1tkYXRhLW1hc29ucnktcHJvZHVjdHMtc2l6ZXJdJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMubWFzb25yeSA9IHtcbiAgICAgIGdhbGxlcnk6IG51bGwsXG4gICAgICByZWxhdGVkUHJvZHVjdHM6IG51bGwsXG4gICAgfTtcblxuICAgIHRoaXMuZmxpY2tpdHkgPSB7XG4gICAgICBnYWxsZXJ5OiBudWxsLFxuICAgICAgcmVsYXRlZFByb2R1Y3RzOiBudWxsLFxuICAgIH07XG5cbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcblxuICAgIHRoaXMuZ2FsbGVyeSA9IHRoaXMuZWwucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9ycy5nYWxsZXJ5LmVsKTtcbiAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0cyA9IHRoaXMuZWwucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9ycy5yZWxhdGVkUHJvZHVjdHMuZWwpO1xuXG4gICAgdGhpcy5oYXNHYWxsZXJ5ID0gISF0aGlzLmdhbGxlcnk7XG4gICAgdGhpcy5oYXNSZWxhdGVkUHJvZHVjdHMgPSAhIXRoaXMucmVsYXRlZFByb2R1Y3RzO1xuXG4gICAgdGhpcy5faW5pdExheW91dCA9IHRoaXMuX2luaXRMYXlvdXQuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB0aGlzLl9pbml0TGF5b3V0KCk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hc29ucnkpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lNYXNvbnJ5KCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBfYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLm9uUmltZ0xvYWRFdmVudCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmZsaWNraXR5LmdhbGxlcnkpIHtcbiAgICAgICAgdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5LmdhbGxlcnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5mbGlja2l0eS5yZWxhdGVkUHJvZHVjdHMpIHtcbiAgICAgICAgdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJlc2l6ZURlYm91bmNlZEV2ZW50ID0gdGhlbWVVdGlscy5kZWJvdW5jZSh0aGlzLl9pbml0TGF5b3V0LCAxMDApO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMucmVzaXplRGVib3VuY2VkRXZlbnQpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuZWwsICdyaW1nOmxvYWQnLCB0aGlzLm9uUmltZ0xvYWRFdmVudCk7XG4gIH1cblxuICBfaW5pdExheW91dCgpIHtcbiAgICBpZiAodGhlbWVVdGlscy5pc1NtYWxsKCkpIHtcbiAgICAgIHRoaXMuX2luaXRNb2JpbGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5pdERlc2t0b3AoKTtcbiAgICB9XG4gIH1cblxuICBfaW5pdE1vYmlsZSgpIHtcbiAgICB0aGlzLl9kZXN0cm95TWFzb25yeSgpO1xuICAgIHRoaXMuX2luaXRGbGlja2l0eSgpO1xuICB9XG5cbiAgX2luaXREZXNrdG9wKCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgIHRoaXMuX2luaXRNYXNvbnJ5KCk7XG4gIH1cblxuICBfaW5pdEZsaWNraXR5KCkge1xuICAgIGlmICh0aGlzLmhhc0dhbGxlcnkgJiYgIXRoaXMuZmxpY2tpdHkuZ2FsbGVyeSkge1xuICAgICAgdGhpcy5fZ2FsbGVyeVJlc2V0KCk7XG5cbiAgICAgIHRoaXMuZmxpY2tpdHkuZ2FsbGVyeSA9IG5ldyBGbGlja2l0eSh0aGlzLmdhbGxlcnksIHtcbiAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXG4gICAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMuZ2FsbGVyeS5pdGVtU2VsZWN0b3IsXG4gICAgICAgIGNvbnRhaW46IGZhbHNlLFxuICAgICAgICBwZXJjZW50UG9zaXRpb246IGZhbHNlLFxuICAgICAgICBwcmV2TmV4dEJ1dHRvbnM6IHRydWUsXG4gICAgICAgIGFkYXB0aXZlSGVpZ2h0OiB0cnVlLFxuICAgICAgICBwYWdlRG90czogdHJ1ZSxcbiAgICAgICAgc2V0R2FsbGVyeVNpemU6IGZhbHNlLFxuICAgICAgICBsYXp5TG9hZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZmxpY2tpdHlFdmVudHMoe1xuICAgICAgICBlbDogdGhpcy5nYWxsZXJ5LFxuICAgICAgICBmbGlja2l0eTogdGhpcy5mbGlja2l0eS5nYWxsZXJ5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzUmVsYXRlZFByb2R1Y3RzICYmICF0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cykge1xuICAgICAgdGhpcy5fcmVsYXRlZFByb2R1Y3RzUmVzZXQoKTtcblxuICAgICAgdGhpcy5mbGlja2l0eS5yZWxhdGVkUHJvZHVjdHMgPSBuZXcgRmxpY2tpdHkodGhpcy5yZWxhdGVkUHJvZHVjdHMsIHtcbiAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXG4gICAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMucmVsYXRlZFByb2R1Y3RzLml0ZW1TZWxlY3RvcixcbiAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgcHJldk5leHRCdXR0b25zOiBmYWxzZSxcbiAgICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZmxpY2tpdHlFdmVudHMoe1xuICAgICAgICBlbDogdGhpcy5yZWxhdGVkUHJvZHVjdHMsXG4gICAgICAgIGZsaWNraXR5OiB0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95RmxpY2tpdHkoKSB7XG4gICAgaWYgKHRoaXMuZmxpY2tpdHkuZ2FsbGVyeSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5nYWxsZXJ5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkuZ2FsbGVyeSA9IG51bGw7XG5cbiAgICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXIodGhpcy5vblJlc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxpY2tpdHkucmVsYXRlZFByb2R1Y3RzKSB7XG4gICAgICB0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2luaXRNYXNvbnJ5KCkge1xuICAgIGlmICh0aGlzLmhhc0dhbGxlcnkgJiYgIXRoaXMubWFzb25yeS5nYWxsZXJ5KSB7XG4gICAgICB0aGlzLl9nYWxsZXJ5UmVzZXQoKTtcbiAgICAgIHRoaXMubWFzb25yeS5nYWxsZXJ5ID0gbmV3IE1hc29ucnlHcmlkKHtcbiAgICAgICAgZWw6IHRoaXMuZ2FsbGVyeSxcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICBpdGVtU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmdhbGxlcnkuaXRlbVNlbGVjdG9yLFxuICAgICAgICAgIGNvbHVtbldpZHRoOiB0aGlzLnNlbGVjdG9ycy5nYWxsZXJ5LmNvbHVtbldpZHRoLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzUmVsYXRlZFByb2R1Y3RzICYmICF0aGlzLm1hc29ucnkucmVsYXRlZFByb2R1Y3RzKSB7XG4gICAgICB0aGlzLl9yZWxhdGVkUHJvZHVjdHNSZXNldCgpO1xuXG4gICAgICB0aGlzLm1hc29ucnkucmVsYXRlZFByb2R1Y3RzID0gbmV3IE1hc29ucnlHcmlkKHtcbiAgICAgICAgZWw6IHRoaXMucmVsYXRlZFByb2R1Y3RzLFxuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIGl0ZW1TZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMucmVsYXRlZFByb2R1Y3RzLml0ZW1TZWxlY3RvcixcbiAgICAgICAgICBjb2x1bW5XaWR0aDogdGhpcy5zZWxlY3RvcnMucmVsYXRlZFByb2R1Y3RzLmNvbHVtbldpZHRoLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3lNYXNvbnJ5KCkge1xuICAgIGlmICh0aGlzLm1hc29ucnkuZ2FsbGVyeSkge1xuICAgICAgdGhpcy5tYXNvbnJ5LmdhbGxlcnkudW5sb2FkKCk7XG4gICAgICB0aGlzLm1hc29ucnkuZ2FsbGVyeSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFzb25yeS5yZWxhdGVkUHJvZHVjdHMpIHtcbiAgICAgIHRoaXMubWFzb25yeS5yZWxhdGVkUHJvZHVjdHMudW5sb2FkKCk7XG4gICAgICB0aGlzLm1hc29ucnkucmVsYXRlZFByb2R1Y3RzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBfZ2FsbGVyeVJlc2V0KCkge1xuICAgIHRoaXMuZ2FsbGVyeVxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZWxlY3RvcnMuZ2FsbGVyeS5pdGVtU2VsZWN0b3IpXG4gICAgICAuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKSk7XG4gIH1cblxuICBfcmVsYXRlZFByb2R1Y3RzUmVzZXQoKSB7XG4gICAgdGhpcy5yZWxhdGVkUHJvZHVjdHNcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuc2VsZWN0b3JzLnJlbGF0ZWRQcm9kdWN0cy5pdGVtU2VsZWN0b3IpXG4gICAgICAuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKSk7XG4gIH1cblxuICBfZmxpY2tpdHlFdmVudHMoeyBlbCwgZmxpY2tpdHkgfSkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KCdwcm9kdWN0LW1hc29ucnktbGF5b3V0JywgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLmZsaWNraXR5UmVzaXplRXZlbnQgPSAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKGZsaWNraXR5KTtcbiAgICB0aGlzLmZsaWNraXR5RGVib3VuY2VkRXZlbnQgPSB0aGVtZVV0aWxzLmRlYm91bmNlKCgpID0+IGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpLCAxMCk7XG5cbiAgICBmbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpKTtcblxuICAgIGZsaWNraXR5Lm9uKCdzZXR0bGUnLCAoKSA9PiBlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KSk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihlbCwgJ3Byb2R1Y3QtbWFzb25yeS1sYXlvdXQnLCB0aGlzLmZsaWNraXR5UmVzaXplRXZlbnQpO1xuXG4gICAgLy8gU2V0cyB0aGUgU2xpZGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHNsaWRlXG4gICAgZWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICB0aGlzLm9uUmVzaXplID0gdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAncmVzaXplJywgdGhpcy5mbGlja2l0eURlYm91bmNlZEV2ZW50KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTkE7QUFhQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQW5OQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductMasonry.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/ProductSlideshow.js":
+/*!*******************************************************!*\
+ !*** ./source/scripts/components/ProductSlideshow.js ***!
+ \*******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ProductSlideshow)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\nclass ProductSlideshow {\n constructor({\n el\n }) {\n this.el = el;\n this.productGalleryNavigationPrevious = this.el.querySelector('.product-thumbnails-navigation-previous');\n this.productGalleryNavigationNext = this.el.querySelector('.product-thumbnails-navigation-next');\n this.productGalleryNavigationWrapper = this.el.querySelector('.product-gallery--navigation-wrapper');\n this.productGalleryNavigation = this.el.querySelector('.product-gallery--navigation');\n this.productGalleryMediaThumbnails = this.el.querySelectorAll('.product-gallery--media-thumbnail');\n\n if (this.productGalleryNavigationPrevious) {\n this.productGalleryNavigationPrevious.addEventListener('click', event => this.moveProductThumbnails(event));\n }\n\n if (this.productGalleryNavigationNext) {\n this.productGalleryNavigationNext.addEventListener('click', event => this.moveProductThumbnails(event));\n }\n\n this.moving = false;\n\n if (this.productGalleryNavigation) {\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.productGalleryNavigation);\n\n if (this.productGalleryNavigation.classList.contains('has-side-scroll')) {\n this.setupProductSlideshow();\n this.productGalleryNavigation.addEventListener('rimg:load', () => {\n this.setupProductSlideshow();\n });\n window.addEventListener('resize', () => {\n const selectedThumbnail = this.el.querySelector('[data-product-gallery-selected=\"true\"]');\n this.setupProductSlideshow(true);\n\n if (selectedThumbnail) {\n this.selectThumbnail(selectedThumbnail.dataset.media);\n } else {\n this.productGalleryNavigation.style.left = 0;\n }\n });\n }\n }\n }\n\n setupProductSlideshow() {\n let tallestImageHeight = 0;\n let containerWidth = 0;\n this.productThumbnailPadding = parseInt(window.getComputedStyle(this.productGalleryMediaThumbnails[0]).paddingLeft, 10) * 2;\n this.productThumbnailMargin = parseInt(window.getComputedStyle(this.productGalleryMediaThumbnails[0]).marginRight, 10) * 2;\n this.productGalleryMediaThumbnails.forEach(productGalleryMediaThumbnail => {\n productGalleryMediaThumbnail.style.width = `${this.productGalleryNavigationWrapper.getBoundingClientRect().width / 4 - this.productThumbnailPadding - this.productThumbnailMargin}px`;\n const currentImageHeight = productGalleryMediaThumbnail.getBoundingClientRect().height;\n let currentImageWidth = productGalleryMediaThumbnail.getBoundingClientRect().width + this.productThumbnailMargin;\n\n if (currentImageHeight > tallestImageHeight) {\n tallestImageHeight = currentImageHeight;\n }\n\n containerWidth += currentImageWidth;\n });\n this.productGalleryNavigationWrapper.style.height = `${tallestImageHeight}px`;\n this.productGalleryNavigation.style.width = `${containerWidth}px`;\n }\n\n moveProductThumbnails(e) {\n const {\n width: containerWidth\n } = this.productGalleryNavigationWrapper.getBoundingClientRect();\n const {\n offsetLeft: currentPosition,\n offsetWidth: totalWidth\n } = this.productGalleryNavigation;\n const rightEdge = -(totalWidth - containerWidth);\n const leftEdge = 0;\n let distance;\n\n if (e.currentTarget.classList.contains('product-thumbnails-navigation-next') && currentPosition - containerWidth > -this.productGalleryNavigation.getBoundingClientRect().width) {\n distance = currentPosition - containerWidth > rightEdge ? currentPosition - containerWidth : rightEdge;\n } else if (e.target.classList.contains('product-thumbnails-navigation-previous') && currentPosition < 0) {\n distance = currentPosition + containerWidth < leftEdge ? currentPosition + containerWidth : leftEdge;\n }\n\n this.productGalleryNavigation.style.left = `${distance}px`;\n }\n\n selectThumbnail(mediaId) {\n if (!this.productGalleryNavigation) return;\n const thumbnail = this.productGalleryNavigation.querySelector(`[data-media=\"${mediaId}\"]`);\n const thumbnailIndex = thumbnail.dataset.productGalleryThumbnail;\n const slides = Math.floor(thumbnailIndex / 4);\n const containerWidth = this.productGalleryNavigationWrapper.getBoundingClientRect().width;\n const newPosition = -(containerWidth * slides);\n this.productGalleryNavigation.style.left = `${newPosition}px`;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RTbGlkZXNob3cuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9Qcm9kdWN0U2xpZGVzaG93LmpzP2M2OWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdFNsaWRlc2hvdyB7XG4gIGNvbnN0cnVjdG9yKHsgZWwgfSkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvblByZXZpb3VzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC10aHVtYm5haWxzLW5hdmlnYXRpb24tcHJldmlvdXMnKTtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbk5leHQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0LXRodW1ibmFpbHMtbmF2aWdhdGlvbi1uZXh0Jyk7XG4gICAgdGhpcy5wcm9kdWN0R2FsbGVyeU5hdmlnYXRpb25XcmFwcGVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1nYWxsZXJ5LS1uYXZpZ2F0aW9uLXdyYXBwZXInKTtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbiA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZ2FsbGVyeS0tbmF2aWdhdGlvbicpO1xuICAgIHRoaXMucHJvZHVjdEdhbGxlcnlNZWRpYVRodW1ibmFpbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LWdhbGxlcnktLW1lZGlhLXRodW1ibmFpbCcpO1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uUHJldmlvdXMpIHtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uUHJldmlvdXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLm1vdmVQcm9kdWN0VGh1bWJuYWlscyhldmVudCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbk5leHQpIHtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uTmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMubW92ZVByb2R1Y3RUaHVtYm5haWxzKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbikge1xuICAgICAgcmltZy53YXRjaCh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2hhcy1zaWRlLXNjcm9sbCcpKSB7XG4gICAgICAgIHRoaXMuc2V0dXBQcm9kdWN0U2xpZGVzaG93KCk7XG4gICAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHsgdGhpcy5zZXR1cFByb2R1Y3RTbGlkZXNob3coKTsgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFRodW1ibmFpbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1nYWxsZXJ5LXNlbGVjdGVkPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIHRoaXMuc2V0dXBQcm9kdWN0U2xpZGVzaG93KHRydWUpO1xuICAgICAgICAgIGlmIChzZWxlY3RlZFRodW1ibmFpbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RUaHVtYm5haWwoc2VsZWN0ZWRUaHVtYm5haWwuZGF0YXNldC5tZWRpYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uLnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBQcm9kdWN0U2xpZGVzaG93KCkge1xuICAgIGxldCB0YWxsZXN0SW1hZ2VIZWlnaHQgPSAwO1xuICAgIGxldCBjb250YWluZXJXaWR0aCA9IDA7XG5cbiAgICB0aGlzLnByb2R1Y3RUaHVtYm5haWxQYWRkaW5nID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsc1swXSkucGFkZGluZ0xlZnQsIDEwKSAqIDI7XG4gICAgdGhpcy5wcm9kdWN0VGh1bWJuYWlsTWFyZ2luID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsc1swXSkubWFyZ2luUmlnaHQsIDEwKSAqIDI7XG5cbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TWVkaWFUaHVtYm5haWxzLmZvckVhY2gocHJvZHVjdEdhbGxlcnlNZWRpYVRodW1ibmFpbCA9PiB7XG4gICAgICBwcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsLnN0eWxlLndpZHRoID0gYCR7KCh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyA0KSAtIHRoaXMucHJvZHVjdFRodW1ibmFpbFBhZGRpbmcgLSB0aGlzLnByb2R1Y3RUaHVtYm5haWxNYXJnaW4pfXB4YDtcblxuICAgICAgY29uc3QgY3VycmVudEltYWdlSGVpZ2h0ID0gcHJvZHVjdEdhbGxlcnlNZWRpYVRodW1ibmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICBsZXQgY3VycmVudEltYWdlV2lkdGggPSBwcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICsgdGhpcy5wcm9kdWN0VGh1bWJuYWlsTWFyZ2luO1xuXG4gICAgICBpZiAoY3VycmVudEltYWdlSGVpZ2h0ID4gdGFsbGVzdEltYWdlSGVpZ2h0KSB7XG4gICAgICAgIHRhbGxlc3RJbWFnZUhlaWdodCA9IGN1cnJlbnRJbWFnZUhlaWdodDtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyV2lkdGggKz0gY3VycmVudEltYWdlV2lkdGg7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbldyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dGFsbGVzdEltYWdlSGVpZ2h0fXB4YDtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5zdHlsZS53aWR0aCA9IGAke2NvbnRhaW5lcldpZHRofXB4YDtcbiAgfVxuXG4gIG1vdmVQcm9kdWN0VGh1bWJuYWlscyhlKSB7XG4gICAgY29uc3QgeyB3aWR0aDogY29udGFpbmVyV2lkdGggfSA9IHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uV3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB7IG9mZnNldExlZnQ6IGN1cnJlbnRQb3NpdGlvbiwgb2Zmc2V0V2lkdGg6IHRvdGFsV2lkdGggfSA9IHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uO1xuICAgIGNvbnN0IHJpZ2h0RWRnZSA9IC0odG90YWxXaWR0aCAtIGNvbnRhaW5lcldpZHRoKTtcbiAgICBjb25zdCBsZWZ0RWRnZSA9IDA7XG4gICAgbGV0IGRpc3RhbmNlO1xuXG4gICAgaWYgKGUuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3Byb2R1Y3QtdGh1bWJuYWlscy1uYXZpZ2F0aW9uLW5leHQnKSAmJiAoKGN1cnJlbnRQb3NpdGlvbiAtIGNvbnRhaW5lcldpZHRoKSA+IC0odGhpcy5wcm9kdWN0R2FsbGVyeU5hdmlnYXRpb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKSkge1xuICAgICAgZGlzdGFuY2UgPSBjdXJyZW50UG9zaXRpb24gLSBjb250YWluZXJXaWR0aCA+IHJpZ2h0RWRnZVxuICAgICAgICA/IGN1cnJlbnRQb3NpdGlvbiAtIGNvbnRhaW5lcldpZHRoXG4gICAgICAgIDogcmlnaHRFZGdlO1xuICAgIH0gZWxzZSBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcm9kdWN0LXRodW1ibmFpbHMtbmF2aWdhdGlvbi1wcmV2aW91cycpICYmIChjdXJyZW50UG9zaXRpb24gPCAwKSkge1xuICAgICAgZGlzdGFuY2UgPSBjdXJyZW50UG9zaXRpb24gKyBjb250YWluZXJXaWR0aCA8IGxlZnRFZGdlXG4gICAgICAgID8gY3VycmVudFBvc2l0aW9uICsgY29udGFpbmVyV2lkdGhcbiAgICAgICAgOiBsZWZ0RWRnZTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5zdHlsZS5sZWZ0ID0gYCR7ZGlzdGFuY2V9cHhgO1xuICB9XG5cbiAgc2VsZWN0VGh1bWJuYWlsKG1lZGlhSWQpIHtcbiAgICBpZiAoIXRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCB0aHVtYm5haWwgPSB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tZWRpYT1cIiR7bWVkaWFJZH1cIl1gKTtcbiAgICBjb25zdCB0aHVtYm5haWxJbmRleCA9IHRodW1ibmFpbC5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5VGh1bWJuYWlsO1xuICAgIGNvbnN0IHNsaWRlcyA9IE1hdGguZmxvb3IodGh1bWJuYWlsSW5kZXggLyA0KTtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uV3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IC0oY29udGFpbmVyV2lkdGggKiBzbGlkZXMpO1xuXG4gICAgdGhpcy5wcm9kdWN0R2FsbGVyeU5hdmlnYXRpb24uc3R5bGUubGVmdCA9IGAke25ld1Bvc2l0aW9ufXB4YDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUE5RkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductSlideshow.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/Quickshop.js":
+/*!************************************************!*\
+ !*** ./source/scripts/components/Quickshop.js ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Quickshop)\n/* harmony export */ });\n/* harmony import */ var _Product__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Product */ \"./source/scripts/components/Product.js\");\n\nclass Quickshop {\n constructor() {\n this.el = document.querySelector('[data-quickshop]');\n this.contentEl = document.querySelector('[data-quickshop-content]');\n this.closeEl = document.querySelector('[data-quickshop-close]');\n this.injectEl = this.el.querySelector('[data-quickshop-product-inject]');\n this.useCaching = !(window.Shopify && window.Shopify.designMode);\n this.deferred = {};\n this.onContentClick = this._onContentClick.bind(this);\n this.onCloseClick = this.close.bind(this);\n }\n\n load(url) {\n let data;\n\n if (url in this.deferred) {\n return this.deferred[url];\n }\n\n this.deferred[url] = new Promise((resolve, reject) => {\n const [baseUrl, params] = url.split('?');\n const request = new XMLHttpRequest();\n request.open('GET', `${baseUrl}?${params ? `${params}&&view=quickshop` : 'view=quickshop'}`, true);\n request.responseType = 'text';\n\n request.onload = () => {\n const el = document.createElement('div');\n el.innerHTML = request.response;\n const options = JSON.parse(el.querySelector('[data-product-options]').innerHTML);\n const html = el.querySelector('[data-product-html]').innerHTML;\n\n if (this.useCaching) {\n try {\n sessionStorage.setItem(url, JSON.stringify({\n options,\n html\n }));\n } catch {}\n }\n\n delete this.deferred[url];\n resolve({\n options,\n html\n });\n };\n\n request.onerror = () => {\n delete this.deferred[url];\n reject();\n };\n\n request.send();\n });\n return this.deferred[url];\n }\n\n open(url) {\n this.el.addEventListener('click', this.onCloseClick);\n this.contentEl.addEventListener('click', this.onContentClick);\n this.closeEl.addEventListener('click', this.onCloseClick);\n this.el.classList.add('quickshop-visible');\n return this.load(url).then(data => {\n this.injectEl.innerHTML = data.html;\n this.product = new _Product__WEBPACK_IMPORTED_MODULE_0__.default(this.injectEl, data.options);\n this.el.classList.add('quickshop-loaded');\n });\n }\n\n close() {\n if (this.product != null) {\n this.product.unload();\n }\n\n this.el.removeEventListener('click', this.onCloseClick);\n this.contentEl.removeEventListener('click', this.onContentClick);\n this.closeEl.removeEventListener('click', this.onCloseClick);\n this.el.classList.remove('quickshop-loaded');\n return this.el.classList.remove('quickshop-visible');\n }\n\n unload() {\n return this.close();\n }\n\n _onContentClick(e) {\n return e.stopPropagation();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1F1aWNrc2hvcC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1F1aWNrc2hvcC5qcz8wNTQ0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9kdWN0IGZyb20gJy4vUHJvZHVjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1aWNrc2hvcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xdWlja3Nob3BdJyk7XG4gICAgdGhpcy5jb250ZW50RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xdWlja3Nob3AtY29udGVudF0nKTtcbiAgICB0aGlzLmNsb3NlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xdWlja3Nob3AtY2xvc2VdJyk7XG4gICAgdGhpcy5pbmplY3RFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcXVpY2tzaG9wLXByb2R1Y3QtaW5qZWN0XScpO1xuICAgIHRoaXMudXNlQ2FjaGluZyA9ICEod2luZG93LlNob3BpZnkgJiYgd2luZG93LlNob3BpZnkuZGVzaWduTW9kZSk7XG5cbiAgICB0aGlzLmRlZmVycmVkID0ge307XG5cbiAgICB0aGlzLm9uQ29udGVudENsaWNrID0gdGhpcy5fb25Db250ZW50Q2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uQ2xvc2VDbGljayA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGxvYWQodXJsKSB7XG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKHVybCBpbiB0aGlzLmRlZmVycmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFt1cmxdO1xuICAgIH1cblxuICAgIHRoaXMuZGVmZXJyZWRbdXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IFtiYXNlVXJsLCBwYXJhbXNdID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgYCR7YmFzZVVybH0/JHtwYXJhbXMgPyBgJHtwYXJhbXN9JiZ2aWV3PXF1aWNrc2hvcGAgOiAndmlldz1xdWlja3Nob3AnfWAsIHRydWUpO1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gcmVxdWVzdC5yZXNwb25zZTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gSlNPTi5wYXJzZShlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LW9wdGlvbnNdJykuaW5uZXJIVE1MKTtcbiAgICAgICAgY29uc3QgaHRtbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtaHRtbF0nKS5pbm5lckhUTUw7XG5cbiAgICAgICAgaWYgKHRoaXMudXNlQ2FjaGluZykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb3B0aW9ucywgaHRtbCB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmZXJyZWRbdXJsXTtcbiAgICAgICAgcmVzb2x2ZSh7IG9wdGlvbnMsIGh0bWwgfSk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZlcnJlZFt1cmxdO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRlZmVycmVkW3VybF07XG4gIH1cblxuICBvcGVuKHVybCkge1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xvc2VDbGljayk7XG4gICAgdGhpcy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ29udGVudENsaWNrKTtcbiAgICB0aGlzLmNsb3NlRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xvc2VDbGljayk7XG5cbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3F1aWNrc2hvcC12aXNpYmxlJyk7XG5cbiAgICByZXR1cm4gdGhpcy5sb2FkKHVybCkudGhlbihkYXRhID0+IHtcbiAgICAgIHRoaXMuaW5qZWN0RWwuaW5uZXJIVE1MID0gZGF0YS5odG1sO1xuICAgICAgdGhpcy5wcm9kdWN0ID0gbmV3IFByb2R1Y3QodGhpcy5pbmplY3RFbCwgZGF0YS5vcHRpb25zKTtcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgncXVpY2tzaG9wLWxvYWRlZCcpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMucHJvZHVjdCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnByb2R1Y3QudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbG9zZUNsaWNrKTtcbiAgICB0aGlzLmNvbnRlbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Db250ZW50Q2xpY2spO1xuICAgIHRoaXMuY2xvc2VFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbG9zZUNsaWNrKTtcblxuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgncXVpY2tzaG9wLWxvYWRlZCcpO1xuICAgIHJldHVybiB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3F1aWNrc2hvcC12aXNpYmxlJyk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkNvbnRlbnRDbGljayhlKSB7XG4gICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6RkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/Quickshop.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/RTE.js":
+/*!******************************************!*\
+ !*** ./source/scripts/components/RTE.js ***!
+ \******************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RTE)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/grouped-content */ \"./node_modules/@pixelunion/grouped-content/dist/index.js\");\n/* harmony import */ var _pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var reframe_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! reframe.js */ \"./node_modules/reframe.js/dist/reframe.es.js\");\n\n\nclass RTE {\n constructor(component) {\n this.el = component.el;\n this.setupTabs();\n (0,reframe_js__WEBPACK_IMPORTED_MODULE_1__.default)(this.el.querySelectorAll('iframe'));\n const videos = this.el.querySelectorAll('iframe');\n\n for (let i = 0; i < videos.length; i++) {\n const video = videos[i];\n\n if (video.classList.contains('highlight')) {\n video.parentNode.classList.add('highlight');\n }\n }\n }\n\n setupTabs() {\n return new (_pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0___default())(this.el, {\n layout: 'tabs',\n intelliparse: false\n });\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1JURS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1JURS5qcz8xYTIwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHcm91cGVkQ29udGVudCBmcm9tICdAcGl4ZWx1bmlvbi9ncm91cGVkLWNvbnRlbnQnO1xuaW1wb3J0IHJlZnJhbWUgZnJvbSAncmVmcmFtZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJURSB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkge1xuICAgIHRoaXMuZWwgPSBjb21wb25lbnQuZWw7XG4gICAgdGhpcy5zZXR1cFRhYnMoKTtcblxuICAgIHJlZnJhbWUodGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSk7XG5cbiAgICBjb25zdCB2aWRlb3MgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlkZW9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2aWRlbyA9IHZpZGVvc1tpXTtcbiAgICAgIGlmICh2aWRlby5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZ2hsaWdodCcpKSB7XG4gICAgICAgIHZpZGVvLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBUYWJzKCkge1xuICAgIHJldHVybiBuZXcgR3JvdXBlZENvbnRlbnQodGhpcy5lbCwgeyBsYXlvdXQ6ICd0YWJzJywgaW50ZWxsaXBhcnNlOiBmYWxzZSB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFuQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/RTE.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/SearchTakeover.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/components/SearchTakeover.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SearchTakeover)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var _SiteOverlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SiteOverlay */ \"./source/scripts/components/SiteOverlay.js\");\n\n\n\nclass SearchTakeover {\n constructor(el) {\n this.el = el;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.siteOverlay = new _SiteOverlay__WEBPACK_IMPORTED_MODULE_2__.default();\n this.input = this.el.querySelector('[data-search-input]');\n this.close = this.el.querySelector('[data-search-takeover-close]');\n this.animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n el: this.el,\n state: 'closed'\n });\n this.isOpen = false;\n this.events.register(window, 'keyup', e => this._onKeyUp(e));\n this.events.register(this.close, 'click', () => this._close());\n this.events.register(document.body, 'click', e => {\n if (!e.target.closest('[data-header-search-toggle], [data-search-takeover]')) {\n this._close();\n }\n });\n }\n\n _onKeyUp(e) {\n if (e.code === 'Escape') {\n this._close();\n }\n }\n\n open() {\n if (this.isOpen) return;\n this.isOpen = true;\n this.animation.animateTo('open').then(() => {\n const {\n length\n } = this.input.value;\n this.input.setSelectionRange(length, length);\n this.input.focus();\n this.siteOverlay.open();\n });\n }\n\n _close() {\n if (!this.isOpen) return;\n this.animation.animateTo('closed').then(() => {\n this.isOpen = false;\n this.siteOverlay.close();\n });\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NlYXJjaFRha2VvdmVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvU2VhcmNoVGFrZW92ZXIuanM/YTA0MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnQHBpeGVsdW5pb24vYW5pbWF0aW9ucyc7XG5pbXBvcnQgU2l0ZU92ZXJsYXkgZnJvbSAnLi9TaXRlT3ZlcmxheSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaFRha2VvdmVyIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5zaXRlT3ZlcmxheSA9IG5ldyBTaXRlT3ZlcmxheSgpO1xuXG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLWlucHV0XScpO1xuICAgIHRoaXMuY2xvc2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC10YWtlb3Zlci1jbG9zZV0nKTtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5lbCwgc3RhdGU6ICdjbG9zZWQnIH0pO1xuXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHdpbmRvdywgJ2tleXVwJywgZSA9PiB0aGlzLl9vbktleVVwKGUpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmNsb3NlLCAnY2xpY2snLCAoKSA9PiB0aGlzLl9jbG9zZSgpKTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGRvY3VtZW50LmJvZHksICdjbGljaycsIGUgPT4ge1xuICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1oZWFkZXItc2VhcmNoLXRvZ2dsZV0sIFtkYXRhLXNlYXJjaC10YWtlb3Zlcl0nKSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX29uS2V5VXAoZSkge1xuICAgIGlmIChlLmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuXG4gICAgdGhpcy5hbmltYXRpb24uYW5pbWF0ZVRvKCdvcGVuJylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMuaW5wdXQudmFsdWU7XG4gICAgICAgIHRoaXMuaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuc2l0ZU92ZXJsYXkub3BlbigpO1xuICAgICAgfSk7XG4gIH1cblxuICBfY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5hbmltYXRpb24uYW5pbWF0ZVRvKCdjbG9zZWQnKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNpdGVPdmVybGF5LmNsb3NlKCk7XG4gICAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbERBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/SearchTakeover.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/Select.js":
+/*!*********************************************!*\
+ !*** ./source/scripts/components/Select.js ***!
+ \*********************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Select)\n/* harmony export */ });\nfunction updateSelect(select) {\n const {\n selectedIndex,\n options\n } = select;\n if (selectedIndex < 0) return;\n const {\n text\n } = options[selectedIndex];\n\n if (text) {\n let sibling = select.parentNode.firstElementChild; // Loop through each sibling and push to the array\n\n while (sibling) {\n if (sibling.nodeType === 1 && sibling !== select && (sibling.classList.contains('selected-text') || sibling.classList.contains('selected-option'))) {\n sibling.innerText = text;\n }\n\n sibling = sibling.nextElementSibling;\n }\n }\n}\n\nclass Select {\n constructor({\n el\n }) {\n const {\n parentElement\n } = el;\n\n if (parentElement && !parentElement.classList.contains('select-wrapper') && !el.classList.contains('product-variants') && !el.classList.contains('select-disable-wrapper')) {\n const wrapperEl = document.createElement('div');\n const selectedTextEl = document.createElement('span');\n wrapperEl.classList.add('select-wrapper');\n selectedTextEl.classList.add('selected-text');\n wrapperEl.appendChild(selectedTextEl);\n parentElement.insertBefore(wrapperEl, el);\n wrapperEl.appendChild(el);\n }\n\n updateSelect(el);\n el.addEventListener('change', event => updateSelect(event.target));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NlbGVjdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NlbGVjdC5qcz81NjA1Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHVwZGF0ZVNlbGVjdChzZWxlY3QpIHtcbiAgY29uc3QgeyBzZWxlY3RlZEluZGV4LCBvcHRpb25zIH0gPSBzZWxlY3Q7XG5cbiAgaWYgKHNlbGVjdGVkSW5kZXggPCAwKSByZXR1cm47XG5cbiAgY29uc3QgeyB0ZXh0IH0gPSBvcHRpb25zW3NlbGVjdGVkSW5kZXhdO1xuXG4gIGlmICh0ZXh0KSB7XG4gICAgbGV0IHNpYmxpbmcgPSBzZWxlY3QucGFyZW50Tm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBzaWJsaW5nIGFuZCBwdXNoIHRvIHRoZSBhcnJheVxuICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHNpYmxpbmcubm9kZVR5cGUgPT09IDFcbiAgICAgICAgJiYgc2libGluZyAhPT0gc2VsZWN0XG4gICAgICAgICYmIChzaWJsaW5nLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQtdGV4dCcpIHx8IHNpYmxpbmcuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1vcHRpb24nKSlcbiAgICAgICkge1xuICAgICAgICBzaWJsaW5nLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgICB9XG5cbiAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IHtcbiAgY29uc3RydWN0b3IoeyBlbCB9KSB7XG4gICAgY29uc3QgeyBwYXJlbnRFbGVtZW50IH0gPSBlbDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmICFwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0LXdyYXBwZXInKSAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcm9kdWN0LXZhcmlhbnRzJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0LWRpc2FibGUtd3JhcHBlcicpKSB7XG4gICAgICBjb25zdCB3cmFwcGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gICAgICB3cmFwcGVyRWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0LXdyYXBwZXInKTtcbiAgICAgIHNlbGVjdGVkVGV4dEVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkLXRleHQnKTtcbiAgICAgIHdyYXBwZXJFbC5hcHBlbmRDaGlsZChzZWxlY3RlZFRleHRFbCk7XG4gICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh3cmFwcGVyRWwsIGVsKTtcbiAgICAgIHdyYXBwZXJFbC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VsZWN0KGVsKTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHVwZGF0ZVNlbGVjdChldmVudC50YXJnZXQpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBbkJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/Select.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/components/SiteOverlay.js":
+/*!**************************************************!*\
+ !*** ./source/scripts/components/SiteOverlay.js ***!
+ \**************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SiteOverlay)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n\n\nclass SiteOverlay {\n constructor() {\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.overlay = document.querySelector('[data-site-overlay]');\n this.animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n el: this.overlay,\n state: 'closed'\n });\n this.events.register(this.overlay, 'click', () => this.close());\n }\n\n open() {\n this.animation.animateTo('open');\n }\n\n close() {\n this.animation.animateTo('closed');\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NpdGVPdmVybGF5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvU2l0ZU92ZXJsYXkuanM/ZjZlMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnQHBpeGVsdW5pb24vYW5pbWF0aW9ucyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpdGVPdmVybGF5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5vdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2l0ZS1vdmVybGF5XScpO1xuICAgIHRoaXMuYW5pbWF0aW9uID0gdHJhbnNpdGlvbih7IGVsOiB0aGlzLm92ZXJsYXksIHN0YXRlOiAnY2xvc2VkJyB9KTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMub3ZlcmxheSwgJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgdGhpcy5hbmltYXRpb24uYW5pbWF0ZVRvKCdvcGVuJyk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmFuaW1hdGlvbi5hbmltYXRlVG8oJ2Nsb3NlZCcpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/SiteOverlay.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/grid.js":
+/*!********************************!*\
+ !*** ./source/scripts/grid.js ***!
+ \********************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _polyfills_nodeListForEach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polyfills/nodeListForEach */ \"./source/scripts/polyfills/nodeListForEach.js\");\n/* harmony import */ var _polyfills_nodeListForEach__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_polyfills_nodeListForEach__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _helpers_globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers/globals */ \"./source/scripts/helpers/globals.js\");\n/* harmony import */ var _helpers_globals__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_helpers_globals__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/shopify-sections-manager */ \"./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\");\n/* harmony import */ var intersection_observer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! intersection-observer */ \"./node_modules/intersection-observer/intersection-observer.js\");\n/* harmony import */ var intersection_observer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(intersection_observer__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_map__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @pixelunion/pxs-map */ \"./node_modules/@pixelunion/pxs-map/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_video__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @pixelunion/pxs-video */ \"./node_modules/@pixelunion/pxs-video/dist/index.es.js\");\n/* harmony import */ var _helpers_polyfill_nodelist_foreach__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers/polyfill-nodelist-foreach */ \"./source/scripts/helpers/polyfill-nodelist-foreach.js\");\n/* harmony import */ var _helpers_polyfill_nodelist_foreach__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_helpers_polyfill_nodelist_foreach__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @pixelunion/age-gate */ \"./node_modules/@pixelunion/age-gate/dist/index.es.js\");\n/* harmony import */ var _helpers_FlickityTouchFix__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./helpers/FlickityTouchFix */ \"./source/scripts/helpers/FlickityTouchFix.js\");\n/* harmony import */ var _templates_TemplateAccount__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./templates/TemplateAccount */ \"./source/scripts/templates/TemplateAccount.js\");\n/* harmony import */ var _templates_TemplateLogin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./templates/TemplateLogin */ \"./source/scripts/templates/TemplateLogin.js\");\n/* harmony import */ var _templates_TemplateGiftCard__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./templates/TemplateGiftCard */ \"./source/scripts/templates/TemplateGiftCard.js\");\n/* harmony import */ var _components_RTE__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/RTE */ \"./source/scripts/components/RTE.js\");\n/* harmony import */ var _components_Select__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./components/Select */ \"./source/scripts/components/Select.js\");\n/* harmony import */ var _components_ProductHighVariant__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/ProductHighVariant */ \"./source/scripts/components/ProductHighVariant.js\");\n/* harmony import */ var _sections_DynamicBlog__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./sections/DynamicBlog */ \"./source/scripts/sections/DynamicBlog.js\");\n/* harmony import */ var _sections_DynamicFeaturedCollection__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./sections/DynamicFeaturedCollection */ \"./source/scripts/sections/DynamicFeaturedCollection.js\");\n/* harmony import */ var _sections_DynamicMasonry__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./sections/DynamicMasonry */ \"./source/scripts/sections/DynamicMasonry.js\");\n/* harmony import */ var _sections_DynamicPromotion__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./sections/DynamicPromotion */ \"./source/scripts/sections/DynamicPromotion.js\");\n/* harmony import */ var _sections_DynamicSlideshow__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./sections/DynamicSlideshow */ \"./source/scripts/sections/DynamicSlideshow.js\");\n/* harmony import */ var _sections_DynamicTestimonials__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./sections/DynamicTestimonials */ \"./source/scripts/sections/DynamicTestimonials.js\");\n/* harmony import */ var _sections_StaticArticle__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./sections/StaticArticle */ \"./source/scripts/sections/StaticArticle.js\");\n/* harmony import */ var _sections_StaticHeader__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./sections/StaticHeader */ \"./source/scripts/sections/StaticHeader.js\");\n/* harmony import */ var _sections_StaticFooter__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./sections/StaticFooter */ \"./source/scripts/sections/StaticFooter.js\");\n/* harmony import */ var _sections_StaticCollection__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./sections/StaticCollection */ \"./source/scripts/sections/StaticCollection.js\");\n/* harmony import */ var _sections_StaticCart__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./sections/StaticCart */ \"./source/scripts/sections/StaticCart.js\");\n/* harmony import */ var _sections_StaticBlog__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./sections/StaticBlog */ \"./source/scripts/sections/StaticBlog.js\");\n/* harmony import */ var _sections_StaticBlogMasonry__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./sections/StaticBlogMasonry */ \"./source/scripts/sections/StaticBlogMasonry.js\");\n/* harmony import */ var _sections_StaticCollectionsList__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./sections/StaticCollectionsList */ \"./source/scripts/sections/StaticCollectionsList.js\");\n/* harmony import */ var _sections_StaticProductRecommendations__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./sections/StaticProductRecommendations */ \"./source/scripts/sections/StaticProductRecommendations.js\");\n/* harmony import */ var _sections_StaticSearch__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./sections/StaticSearch */ \"./source/scripts/sections/StaticSearch.js\");\n/* harmony import */ var _sections_ProductSection__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./sections/ProductSection */ \"./source/scripts/sections/ProductSection.js\");\n\n\n\n\n\n\n\n\n // Flickity iOS fix\n\n // Templates\n\n\n\n // Components\n\n\n\n // Dynamic Sections\n\n\n\n\n\n\n // Static sections\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction spamCheck(e) {\n if (e.target.querySelector('.comment-check').value.length > 0) {\n e.preventDefault();\n }\n}\n\n_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__.default.init();\nconst sections = new _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_2__.default(); // Dynamic Sections\n\nsections.register('dynamic-blog', section => new _sections_DynamicBlog__WEBPACK_IMPORTED_MODULE_16__.default(section));\nsections.register('dynamic-featured-collection', section => new _sections_DynamicFeaturedCollection__WEBPACK_IMPORTED_MODULE_17__.default(section));\nsections.register('dynamic-masonry', section => new _sections_DynamicMasonry__WEBPACK_IMPORTED_MODULE_18__.default(section));\nsections.register('dynamic-promotion', section => new _sections_DynamicPromotion__WEBPACK_IMPORTED_MODULE_19__.default(section));\nsections.register('dynamic-slideshow', section => new _sections_DynamicSlideshow__WEBPACK_IMPORTED_MODULE_20__.default(section));\nsections.register('dynamic-testimonials', section => new _sections_DynamicTestimonials__WEBPACK_IMPORTED_MODULE_21__.default(section));\nsections.register('pxs-video', section => new _pixelunion_pxs_video__WEBPACK_IMPORTED_MODULE_6__.default(section));\nsections.register('product', section => new _sections_ProductSection__WEBPACK_IMPORTED_MODULE_32__.default(section));\nsections.register('pxs-map', section => new _pixelunion_pxs_map__WEBPACK_IMPORTED_MODULE_5__.default(section)); // Static Sections\n\nsections.register('static-article', section => new _sections_StaticArticle__WEBPACK_IMPORTED_MODULE_22__.default(section));\nsections.register('static-collection', section => new _sections_StaticCollection__WEBPACK_IMPORTED_MODULE_25__.default(section));\nsections.register('static-collections-list', section => new _sections_StaticCollectionsList__WEBPACK_IMPORTED_MODULE_29__.default(section));\nsections.register('static-header', section => new _sections_StaticHeader__WEBPACK_IMPORTED_MODULE_23__.default(section));\nsections.register('static-footer', section => new _sections_StaticFooter__WEBPACK_IMPORTED_MODULE_24__.default(section));\nsections.register('static-cart', section => new _sections_StaticCart__WEBPACK_IMPORTED_MODULE_26__.default(section));\nsections.register('static-blog', section => new _sections_StaticBlog__WEBPACK_IMPORTED_MODULE_27__.default(section));\nsections.register('static-blog-masonry', section => new _sections_StaticBlogMasonry__WEBPACK_IMPORTED_MODULE_28__.default(section));\nsections.register('static-product-recommendations', section => new _sections_StaticProductRecommendations__WEBPACK_IMPORTED_MODULE_30__.default(section));\nsections.register('static-search', section => new _sections_StaticSearch__WEBPACK_IMPORTED_MODULE_31__.default(section));\nsections.register('age-gate', section => new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_8__.PageAgeGate(section));\n(0,_helpers_FlickityTouchFix__WEBPACK_IMPORTED_MODULE_9__.default)();\nconst contactForm = document.querySelector('.contact-form');\n\nif (contactForm) {\n contactForm.addEventListener('submit', event => spamCheck(event));\n}\n\ndocument.addEventListener('DOMContentLoaded', () => document.documentElement.classList.remove('loading')); // Set up conditionals\n\nconst isProduct = document.body.classList.contains('template-product');\nconst isProductHighVariant = isProduct && document.querySelector('product-form');\nconst customerTemplates = [\"template-order\", \"template-addresses\", \"template-login\", \"template-account\"];\nlet isAccount;\n\nfor (let i = 0; i < customerTemplates.length; i++) {\n if (document.body.classList.contains(customerTemplates[i])) {\n isAccount = true;\n }\n}\n\nconst isPasswordPage = document.body.classList.contains('template-password');\nconst isGiftCardPage = document.body.classList.contains('template-gift_card');\n\nif (isAccount) {\n new _templates_TemplateAccount__WEBPACK_IMPORTED_MODULE_10__.default({\n el: document.body\n });\n}\n\nif (isPasswordPage) {\n new _templates_TemplateLogin__WEBPACK_IMPORTED_MODULE_11__.default();\n}\n\nif (isGiftCardPage) {\n new _templates_TemplateGiftCard__WEBPACK_IMPORTED_MODULE_12__.default();\n}\n\nif (!isProduct) {\n document.querySelectorAll('.rte').forEach(rte => new _components_RTE__WEBPACK_IMPORTED_MODULE_13__.default({\n el: rte\n }));\n document.querySelectorAll('select').forEach(sel => new _components_Select__WEBPACK_IMPORTED_MODULE_14__.default({\n el: sel\n }));\n}\n\nif (isProductHighVariant) {\n new _components_ProductHighVariant__WEBPACK_IMPORTED_MODULE_15__.default();\n}\n\nconst ageGatePage = document.getElementById('age-gate-page');\n\nif (ageGatePage) {\n new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_8__.SiteAgeGate(ageGatePage);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9ncmlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2dyaWQuanM/ZWVlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vcG9seWZpbGxzL25vZGVMaXN0Rm9yRWFjaCc7XG5pbXBvcnQgJy4vaGVscGVycy9nbG9iYWxzJztcbmltcG9ydCBTaG9waWZ5U2VjdGlvbnNNYW5hZ2VyIGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktc2VjdGlvbnMtbWFuYWdlcic7XG5pbXBvcnQgJ2ludGVyc2VjdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IFB4c01hcCBmcm9tICdAcGl4ZWx1bmlvbi9weHMtbWFwJztcbmltcG9ydCBQeHNWaWRlbyBmcm9tICdAcGl4ZWx1bmlvbi9weHMtdmlkZW8nO1xuaW1wb3J0ICcuL2hlbHBlcnMvcG9seWZpbGwtbm9kZWxpc3QtZm9yZWFjaCc7XG5pbXBvcnQgeyBTaXRlQWdlR2F0ZSwgUGFnZUFnZUdhdGUgfSBmcm9tICdAcGl4ZWx1bmlvbi9hZ2UtZ2F0ZSc7XG5cbi8vIEZsaWNraXR5IGlPUyBmaXhcbmltcG9ydCBmbGlja2l0eVRvdWNoRml4IGZyb20gJy4vaGVscGVycy9GbGlja2l0eVRvdWNoRml4Jztcbi8vIFRlbXBsYXRlc1xuaW1wb3J0IFRlbXBsYXRlQWNjb3VudCBmcm9tICcuL3RlbXBsYXRlcy9UZW1wbGF0ZUFjY291bnQnO1xuaW1wb3J0IFRlbXBsYXRlTG9naW4gZnJvbSAnLi90ZW1wbGF0ZXMvVGVtcGxhdGVMb2dpbic7XG5pbXBvcnQgVGVtcGxhdGVHaWZ0Q2FyZCBmcm9tICcuL3RlbXBsYXRlcy9UZW1wbGF0ZUdpZnRDYXJkJztcbi8vIENvbXBvbmVudHNcbmltcG9ydCBSVEUgZnJvbSAnLi9jb21wb25lbnRzL1JURSc7XG5pbXBvcnQgU2VsZWN0IGZyb20gJy4vY29tcG9uZW50cy9TZWxlY3QnO1xuaW1wb3J0IFByb2R1Y3RIaWdoVmFyaWFudCBmcm9tICcuL2NvbXBvbmVudHMvUHJvZHVjdEhpZ2hWYXJpYW50Jztcbi8vIER5bmFtaWMgU2VjdGlvbnNcbmltcG9ydCBEeW5hbWljQmxvZyBmcm9tICcuL3NlY3Rpb25zL0R5bmFtaWNCbG9nJztcbmltcG9ydCBEeW5hbWljRmVhdHVyZWRDb2xsZWN0aW9uIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbic7XG5pbXBvcnQgRHluYW1pY01hc29ucnkgZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljTWFzb25yeSc7XG5pbXBvcnQgRHluYW1pY1Byb21vdGlvbiBmcm9tICcuL3NlY3Rpb25zL0R5bmFtaWNQcm9tb3Rpb24nO1xuaW1wb3J0IER5bmFtaWNTbGlkZXNob3cgZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljU2xpZGVzaG93JztcbmltcG9ydCBEeW5hbWljVGVzdGltb25pYWxzIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY1Rlc3RpbW9uaWFscyc7XG4vLyBTdGF0aWMgc2VjdGlvbnNcbmltcG9ydCBTdGF0aWNBcnRpY2xlIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQXJ0aWNsZSc7XG5pbXBvcnQgU3RhdGljSGVhZGVyIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljSGVhZGVyJztcbmltcG9ydCBTdGF0aWNGb290ZXIgZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNGb290ZXInO1xuaW1wb3J0IFN0YXRpY0NvbGxlY3Rpb24gZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uJztcbmltcG9ydCBTdGF0aWNDYXJ0IGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQ2FydCc7XG5pbXBvcnQgU3RhdGljQmxvZyBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0Jsb2cnO1xuaW1wb3J0IFN0YXRpY0Jsb2dNYXNvbnJ5IGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQmxvZ01hc29ucnknO1xuaW1wb3J0IFN0YXRpY0NvbGxlY3Rpb25zTGlzdCBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0NvbGxlY3Rpb25zTGlzdCc7XG5pbXBvcnQgU3RhdGljUHJvZHVjdFJlY29tbWVuZGF0aW9ucyBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY1Byb2R1Y3RSZWNvbW1lbmRhdGlvbnMnO1xuaW1wb3J0IFN0YXRpY1NlYXJjaCBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY1NlYXJjaCc7XG5pbXBvcnQgUHJvZHVjdFNlY3Rpb24gZnJvbSAnLi9zZWN0aW9ucy9Qcm9kdWN0U2VjdGlvbic7XG5cbmZ1bmN0aW9uIHNwYW1DaGVjayhlKSB7XG4gIGlmIChlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCcuY29tbWVudC1jaGVjaycpLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cblxucmltZy5pbml0KCk7XG5cbmNvbnN0IHNlY3Rpb25zID0gbmV3IFNob3BpZnlTZWN0aW9uc01hbmFnZXIoKTtcbi8vIER5bmFtaWMgU2VjdGlvbnNcbnNlY3Rpb25zLnJlZ2lzdGVyKCdkeW5hbWljLWJsb2cnLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljQmxvZyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1mZWF0dXJlZC1jb2xsZWN0aW9uJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbihzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1tYXNvbnJ5Jywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY01hc29ucnkoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtcHJvbW90aW9uJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY1Byb21vdGlvbihzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1zbGlkZXNob3cnLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljU2xpZGVzaG93KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdkeW5hbWljLXRlc3RpbW9uaWFscycsIHNlY3Rpb24gPT4gbmV3IER5bmFtaWNUZXN0aW1vbmlhbHMoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3B4cy12aWRlbycsIHNlY3Rpb24gPT4gbmV3IFB4c1ZpZGVvKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdwcm9kdWN0Jywgc2VjdGlvbiA9PiBuZXcgUHJvZHVjdFNlY3Rpb24oc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3B4cy1tYXAnLCBzZWN0aW9uID0+IG5ldyBQeHNNYXAoc2VjdGlvbikpO1xuLy8gU3RhdGljIFNlY3Rpb25zXG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWFydGljbGUnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNBcnRpY2xlKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtY29sbGVjdGlvbicsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0NvbGxlY3Rpb24oc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1jb2xsZWN0aW9ucy1saXN0Jywgc2VjdGlvbiA9PiBuZXcgU3RhdGljQ29sbGVjdGlvbnNMaXN0KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtaGVhZGVyJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljSGVhZGVyKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtZm9vdGVyJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljRm9vdGVyKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtY2FydCcsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0NhcnQoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1ibG9nJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljQmxvZyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWJsb2ctbWFzb25yeScsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0Jsb2dNYXNvbnJ5KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtcHJvZHVjdC1yZWNvbW1lbmRhdGlvbnMnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNQcm9kdWN0UmVjb21tZW5kYXRpb25zKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtc2VhcmNoJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljU2VhcmNoKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdhZ2UtZ2F0ZScsIHNlY3Rpb24gPT4gbmV3IFBhZ2VBZ2VHYXRlKHNlY3Rpb24pKTtcblxuZmxpY2tpdHlUb3VjaEZpeCgpO1xuXG5jb25zdCBjb250YWN0Rm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWN0LWZvcm0nKTtcblxuaWYgKGNvbnRhY3RGb3JtKSB7XG4gIGNvbnRhY3RGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGV2ZW50ID0+IHNwYW1DaGVjayhldmVudCkpO1xufVxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKSk7XG5cbi8vIFNldCB1cCBjb25kaXRpb25hbHNcbmNvbnN0IGlzUHJvZHVjdCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0ZW1wbGF0ZS1wcm9kdWN0Jyk7XG5jb25zdCBpc1Byb2R1Y3RIaWdoVmFyaWFudCA9IGlzUHJvZHVjdCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwcm9kdWN0LWZvcm0nKTtcbmNvbnN0IGN1c3RvbWVyVGVtcGxhdGVzID0gW1widGVtcGxhdGUtb3JkZXJcIiwgXCJ0ZW1wbGF0ZS1hZGRyZXNzZXNcIiwgXCJ0ZW1wbGF0ZS1sb2dpblwiLCBcInRlbXBsYXRlLWFjY291bnRcIl07XG5sZXQgaXNBY2NvdW50O1xuZm9yIChsZXQgaT0wO2k8Y3VzdG9tZXJUZW1wbGF0ZXMubGVuZ3RoO2krKykge1xuICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoY3VzdG9tZXJUZW1wbGF0ZXNbaV0pKSB7XG4gICAgaXNBY2NvdW50ID0gdHJ1ZTtcbiAgfVxufVxuY29uc3QgaXNQYXNzd29yZFBhZ2UgPSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygndGVtcGxhdGUtcGFzc3dvcmQnKTtcbmNvbnN0IGlzR2lmdENhcmRQYWdlID0gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3RlbXBsYXRlLWdpZnRfY2FyZCcpO1xuXG5pZiAoaXNBY2NvdW50KSB7IG5ldyBUZW1wbGF0ZUFjY291bnQoeyBlbDogZG9jdW1lbnQuYm9keSB9KTsgfVxuaWYgKGlzUGFzc3dvcmRQYWdlKSB7IG5ldyBUZW1wbGF0ZUxvZ2luKCk7IH1cbmlmIChpc0dpZnRDYXJkUGFnZSkgeyBuZXcgVGVtcGxhdGVHaWZ0Q2FyZCgpOyB9XG5cbmlmICghaXNQcm9kdWN0KSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ydGUnKS5mb3JFYWNoKHJ0ZSA9PiBuZXcgUlRFKHsgZWw6IHJ0ZSB9KSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2goc2VsID0+IG5ldyBTZWxlY3QoeyBlbDogc2VsIH0pKTtcbn1cblxuaWYgKGlzUHJvZHVjdEhpZ2hWYXJpYW50KSB7XG4gIG5ldyBQcm9kdWN0SGlnaFZhcmlhbnQoKTtcbn1cblxuY29uc3QgYWdlR2F0ZVBhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlLWdhdGUtcGFnZScpO1xuXG5pZiAoYWdlR2F0ZVBhZ2UpIHtcbiAgbmV3IFNpdGVBZ2VHYXRlKGFnZUdhdGVQYWdlKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/grid.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/helpers/FlickityA11yPatch.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/helpers/FlickityA11yPatch.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FlickityA11yPatch)\n/* harmony export */ });\nclass FlickityA11yPatch {\n constructor(slider) {\n this.slider = slider;\n this.observer = new MutationObserver(m => this._removeAttr(m));\n this.observer.observe(this.slider, {\n attributes: true,\n childList: true,\n subtree: true\n });\n this.slider.querySelectorAll('[aria-hidden]').forEach(el => {\n el.removeAttribute('aria-hidden');\n });\n }\n\n _removeAttr(mutations) {\n if (mutations.length) {\n mutations.forEach(m => {\n if (m?.target && m.target.hasAttribute('aria-hidden')) {\n m.target.removeAttribute('aria-hidden');\n }\n });\n }\n }\n\n unload() {\n this.observer.disconnect();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0ZsaWNraXR5QTExeVBhdGNoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvRmxpY2tpdHlBMTF5UGF0Y2guanM/YmJhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBGbGlja2l0eUExMXlQYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHNsaWRlcikge1xuICAgIHRoaXMuc2xpZGVyID0gc2xpZGVyO1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtID0+IHRoaXMuX3JlbW92ZUF0dHIobSkpO1xuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnNsaWRlciwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnNsaWRlci5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1oaWRkZW5dJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVtb3ZlQXR0cihtdXRhdGlvbnMpIHtcbiAgICBpZiAobXV0YXRpb25zLmxlbmd0aCkge1xuICAgICAgbXV0YXRpb25zLmZvckVhY2gobSA9PiB7XG4gICAgICAgIGlmIChtPy50YXJnZXQgJiYgbS50YXJnZXQuaGFzQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKSB7XG4gICAgICAgICAgbS50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/FlickityA11yPatch.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/helpers/FlickityTouchFix.js":
+/*!****************************************************!*\
+ !*** ./source/scripts/helpers/FlickityTouchFix.js ***!
+ \****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// This is a helper class to fix a touch issue that came up in flickity\n// on iOS devices as of version 13. It should smooth out some of the scroll\n// and swipe issues that flickity is having on that version of iOS.\nconst flickityTouchFix = () => {\n let touchingSlider = false;\n let touchStartCoordsX = 0;\n\n const onTouchStart = e => {\n if (e.target.closest && e.target.closest('.flickity-slider')) {\n touchingSlider = true;\n touchStartCoordsX = e.touches[0].pageX;\n } else {\n touchingSlider = false;\n }\n };\n\n const onTouchMove = e => {\n if (!(touchingSlider && e.cancelable)) {\n return;\n }\n\n if (Math.abs(e.touches[0].pageX - touchStartCoordsX) > 10) {\n e.preventDefault();\n }\n };\n\n document.body.addEventListener('touchstart', onTouchStart);\n document.body.addEventListener('touchmove', onTouchMove, {\n passive: false\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (flickityTouchFix);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0ZsaWNraXR5VG91Y2hGaXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9GbGlja2l0eVRvdWNoRml4LmpzPzlmNTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBmaXggYSB0b3VjaCBpc3N1ZSB0aGF0IGNhbWUgdXAgaW4gZmxpY2tpdHlcbi8vIG9uIGlPUyBkZXZpY2VzIGFzIG9mIHZlcnNpb24gMTMuIEl0IHNob3VsZCBzbW9vdGggb3V0IHNvbWUgb2YgdGhlIHNjcm9sbFxuLy8gYW5kIHN3aXBlIGlzc3VlcyB0aGF0IGZsaWNraXR5IGlzIGhhdmluZyBvbiB0aGF0IHZlcnNpb24gb2YgaU9TLlxuY29uc3QgZmxpY2tpdHlUb3VjaEZpeCA9ICgpID0+IHtcbiAgbGV0IHRvdWNoaW5nU2xpZGVyID0gZmFsc2U7XG4gIGxldCB0b3VjaFN0YXJ0Q29vcmRzWCA9IDA7XG5cbiAgY29uc3Qgb25Ub3VjaFN0YXJ0ID0gZSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QgJiYgZS50YXJnZXQuY2xvc2VzdCgnLmZsaWNraXR5LXNsaWRlcicpKSB7XG4gICAgICB0b3VjaGluZ1NsaWRlciA9IHRydWU7XG4gICAgICB0b3VjaFN0YXJ0Q29vcmRzWCA9IGUudG91Y2hlc1swXS5wYWdlWDtcbiAgICB9IGVsc2Uge1xuICAgICAgdG91Y2hpbmdTbGlkZXIgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25Ub3VjaE1vdmUgPSBlID0+IHtcbiAgICBpZiAoISh0b3VjaGluZ1NsaWRlciAmJiBlLmNhbmNlbGFibGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGUudG91Y2hlc1swXS5wYWdlWCAtIHRvdWNoU3RhcnRDb29yZHNYKSA+IDEwKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmbGlja2l0eVRvdWNoRml4O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/FlickityTouchFix.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/helpers/VariantHelper.js":
+/*!*************************************************!*\
+ !*** ./source/scripts/helpers/VariantHelper.js ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ VariantHelper)\n/* harmony export */ });\nfunction filter(nodelist, fn) {\n const filtered = [];\n\n for (let i = 0; i < nodelist.length; i++) {\n const node = nodelist[i];\n\n if (fn(node)) {\n filtered.push(node);\n }\n }\n\n return filtered;\n}\n\nclass VariantHelper {\n constructor({\n addToCartButton = null,\n // Add to cart button element\n priceFields = null,\n // Price field elements\n productForm = null,\n // Product form element\n productGallery = null,\n // Product gallery object\n selector = null,\n // Variant select or input elements,\n type = 'select',\n // Type of selector element\n productJSON = null,\n // Product JSON\n productSettings = null,\n // Product settings JSON\n unitPrice = null,\n // Unit price element\n taxLine = null,\n // Tax line element\n quantityInput = null // Quantity input element\n\n }) {\n this.callbacks = [];\n this.options = {\n addToCartButton,\n priceFields,\n productForm,\n productGallery,\n selector,\n type,\n productJSON,\n productSettings,\n unitPrice,\n taxLine,\n quantityInput\n };\n this.enableHistory = false;\n this.masterSelect = this.options.productForm.querySelector('.product-select'); // Disabled history state updating in the TE\n\n const isShopify = window.Shopify && window.Shopify.preview_host;\n\n if (window.history && window.history.replaceState && this.options.productSettings.enableHistory && !isShopify) {\n this.enableHistory = true;\n }\n\n this._init();\n\n this._bindEvents();\n }\n\n onVariantChange(callback) {\n if (this.callbacks.indexOf(callback) >= 0) {\n return;\n }\n\n this.callbacks.push(callback);\n }\n\n offVariantChange(callback) {\n if (this.callbacks.indexOf(callback) === -1) {\n return;\n }\n\n this.callbacks.splice(this.callbacks.indexOf(callback));\n }\n\n _init() {\n if (this.options.type === 'select') {\n this.options.selector.forEach(selector => this._setSelectLabel(selector));\n }\n }\n\n _bindEvents() {\n this.options.selector.forEach(selector => selector.addEventListener('change', event => this._variantChange(event)));\n }\n\n unload() {\n this.options.selector.forEach(selector => selector.removeEventListener('change', event => this._variantChange(event)));\n }\n\n _setSelectLabel(select) {\n if (!select) return;\n const {\n value,\n previousSibling\n } = select;\n previousSibling.innerText = value;\n }\n\n getCurrentOptions() {\n const productOptions = [];\n let inputs = this.options.selector;\n\n if (this.options.type === 'radio') {\n inputs = filter(inputs, input => input.checked);\n }\n\n inputs.forEach(input => productOptions.push(input.value));\n return productOptions;\n }\n\n getVariantFromOptions(productOptions) {\n if (this.options.productJSON.variants == null) {\n return;\n }\n\n let foundVariant = null;\n\n for (let i = 0; i < this.options.productJSON.variants.length; i++) {\n const variant = this.options.productJSON.variants[i];\n const isMatch = productOptions.every((value, index) => variant.options[index] === value);\n\n if (isMatch) {\n foundVariant = variant;\n }\n }\n\n return foundVariant;\n }\n\n _updateMasterSelect(variant) {\n if (variant == null) {\n return;\n }\n\n const event = document.createEvent('Event');\n event.initEvent('change', true, true);\n this.masterSelect.value = variant.id;\n this.masterSelect.dispatchEvent(event);\n }\n\n _updatePrice(variant) {\n const {\n addToCartButton,\n priceFields,\n productSettings,\n unitPrice,\n taxLine,\n productDetails\n } = this.options;\n const unitPriceAmount = unitPrice ? unitPrice.querySelector('[data-unit-price-amount]') : null;\n const unitPriceMeasure = unitPrice ? unitPrice.querySelector('[data-unit-price-measure]') : null;\n const unitPriceQuantity = unitPrice ? unitPrice.querySelector('[data-unit-price-quantity]') : null;\n\n if (variant) {\n // strip all of the old data attributes\n priceFields.forEach(priceField => {\n const moneyEls = priceField.querySelectorAll('.money');\n moneyEls.forEach(moneyEl => {\n for (let j = 0; j < moneyEl.attributes.length; j++) {\n const attribute = moneyEl.attributes[j];\n\n if (attribute.name.indexOf('data-') > -1) {\n moneyEl.removeAttribute(attribute.name);\n }\n }\n });\n });\n\n if (taxLine) {\n if (variant.taxable) {\n taxLine.classList.remove('hidden');\n } else {\n taxLine.classList.add('hidden');\n }\n }\n\n if (variant.available && !document.body.classList.contains('template-password')) {\n addToCartButton.value = productSettings.addToCartText;\n addToCartButton.classList.remove('disabled');\n addToCartButton.removeAttribute('disabled');\n } else {\n addToCartButton.value = productSettings.soldOutText;\n addToCartButton.classList.add('disabled');\n addToCartButton.setAttribute('disabled', '');\n }\n\n if (variant.compare_at_price > variant.price) {\n priceFields.forEach(priceField => {\n const moneyEls = priceField.querySelectorAll('.money:not(.original)');\n moneyEls.forEach(moneyEl => {\n moneyEl.innerHTML = window.Theme.Currency.formatMoney(variant.price, window.Theme.moneyFormat);\n });\n });\n priceFields.forEach(priceField => {\n const moneyEls = priceField.querySelectorAll('.money.original');\n moneyEls.forEach(moneyEl => {\n moneyEl.innerHTML = window.Theme.Currency.formatMoney(variant.compare_at_price, window.Theme.moneyFormat);\n moneyEl.classList.add('visible');\n });\n });\n } else {\n priceFields.forEach(priceField => {\n const moneyEls = priceField.querySelectorAll('.money');\n moneyEls.forEach(moneyEl => {\n moneyEl.innerHTML = window.Theme.Currency.formatMoney(variant.price, window.Theme.moneyFormat);\n });\n });\n priceFields.forEach(priceField => {\n const moneyEls = priceField.querySelectorAll('.money.original');\n moneyEls.forEach(moneyEl => {\n moneyEl.classList.remove('visible');\n });\n });\n }\n\n if (variant.unit_price) {\n unitPrice.classList.remove('hidden');\n\n if (unitPriceQuantity) {\n unitPriceQuantity.innerHTML = `${variant.unit_price_measurement.quantity_value}${variant.unit_price_measurement.quantity_unit}`;\n }\n\n if (unitPriceAmount) {\n unitPriceAmount.innerHTML = window.Theme.Currency.formatMoney(variant.unit_price, Theme.moneyFormat);\n }\n\n if (unitPriceMeasure) {\n if (variant.unit_price_measurement.reference_value !== 1) {\n unitPriceMeasure.innerHTML = `${variant.unit_price_measurement.reference_value}${variant.unit_price_measurement.reference_unit}`;\n } else {\n unitPriceMeasure.innerHTML = variant.unit_price_measurement.reference_unit;\n }\n }\n } else if (unitPrice) {\n unitPrice.classList.add('hidden');\n }\n } else {\n // Variant doesn't exist\n addToCartButton.value = productSettings.unavailableText;\n addToCartButton.classList.add('disabled');\n addToCartButton.setAttribute('disabled', '');\n }\n }\n\n _updateImages(variant) {\n const imageId = __guard__(variant != null ? variant.featured_image : undefined, x => x.id);\n\n const imagePosition = __guard__(variant != null ? variant.featured_image : undefined, x1 => x1.position) - 1;\n this.options.productGallery.selectMediaByVariant(variant);\n }\n\n _updateHistory(variant) {\n if (!this.enableHistory || variant == null) {\n return;\n }\n\n const re = new RegExp('([?|&]variant=)[0-9]+(&{0,1})');\n let {\n search\n } = window.location;\n\n if (search.match(re)) {\n search = search.replace(re, `$1${variant.id}$2`);\n } else if (search.indexOf('?') !== -1) {\n search += `&variant=${variant.id}`;\n } else {\n search += `?variant=${variant.id}`;\n }\n\n const newUrl = [window.location.protocol, '//', window.location.host, window.location.pathname, search];\n const variantUrl = newUrl.join('');\n window.history.replaceState({\n path: variantUrl\n }, '', variantUrl);\n }\n\n _variantChange(event) {\n if (this.options.type === 'select') {\n this._setSelectLabel(event.currentTarget);\n }\n\n const productOptions = this.getCurrentOptions();\n const variant = this.getVariantFromOptions(productOptions);\n\n this._updateMasterSelect(variant);\n\n this._updatePrice(variant);\n\n this._updateImages(variant);\n\n this._updateHistory(variant);\n\n this.callbacks.forEach(callback => callback(variant));\n }\n\n}\n\nfunction __guard__(value, transform) {\n return typeof value !== 'undefined' && value !== null ? transform(value) : undefined;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1ZhcmlhbnRIZWxwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9WYXJpYW50SGVscGVyLmpzP2QxZTAiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gZmlsdGVyKG5vZGVsaXN0LCBmbikge1xuICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZWxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBub2RlID0gbm9kZWxpc3RbaV07XG5cbiAgICBpZiAoZm4obm9kZSkpIHtcbiAgICAgIGZpbHRlcmVkLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYXJpYW50SGVscGVyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGFkZFRvQ2FydEJ1dHRvbiA9IG51bGwsIC8vIEFkZCB0byBjYXJ0IGJ1dHRvbiBlbGVtZW50XG4gICAgcHJpY2VGaWVsZHMgPSBudWxsLCAvLyBQcmljZSBmaWVsZCBlbGVtZW50c1xuICAgIHByb2R1Y3RGb3JtID0gbnVsbCwgLy8gUHJvZHVjdCBmb3JtIGVsZW1lbnRcbiAgICBwcm9kdWN0R2FsbGVyeSA9IG51bGwsIC8vIFByb2R1Y3QgZ2FsbGVyeSBvYmplY3RcbiAgICBzZWxlY3RvciA9IG51bGwsIC8vIFZhcmlhbnQgc2VsZWN0IG9yIGlucHV0IGVsZW1lbnRzLFxuICAgIHR5cGUgPSAnc2VsZWN0JywgLy8gVHlwZSBvZiBzZWxlY3RvciBlbGVtZW50XG4gICAgcHJvZHVjdEpTT04gPSBudWxsLCAvLyBQcm9kdWN0IEpTT05cbiAgICBwcm9kdWN0U2V0dGluZ3MgPSBudWxsLCAvLyBQcm9kdWN0IHNldHRpbmdzIEpTT05cbiAgICB1bml0UHJpY2UgPSBudWxsLCAvLyBVbml0IHByaWNlIGVsZW1lbnRcbiAgICB0YXhMaW5lID0gbnVsbCwgLy8gVGF4IGxpbmUgZWxlbWVudFxuICAgIHF1YW50aXR5SW5wdXQgPSBudWxsLCAvLyBRdWFudGl0eSBpbnB1dCBlbGVtZW50XG4gIH0pIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgYWRkVG9DYXJ0QnV0dG9uLFxuICAgICAgcHJpY2VGaWVsZHMsXG4gICAgICBwcm9kdWN0Rm9ybSxcbiAgICAgIHByb2R1Y3RHYWxsZXJ5LFxuICAgICAgc2VsZWN0b3IsXG4gICAgICB0eXBlLFxuICAgICAgcHJvZHVjdEpTT04sXG4gICAgICBwcm9kdWN0U2V0dGluZ3MsXG4gICAgICB1bml0UHJpY2UsXG4gICAgICB0YXhMaW5lLFxuICAgICAgcXVhbnRpdHlJbnB1dCxcbiAgICB9O1xuXG4gICAgdGhpcy5lbmFibGVIaXN0b3J5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXN0ZXJTZWxlY3QgPSB0aGlzLm9wdGlvbnMucHJvZHVjdEZvcm0ucXVlcnlTZWxlY3RvcignLnByb2R1Y3Qtc2VsZWN0Jyk7XG5cbiAgICAvLyBEaXNhYmxlZCBoaXN0b3J5IHN0YXRlIHVwZGF0aW5nIGluIHRoZSBURVxuICAgIGNvbnN0IGlzU2hvcGlmeSA9IHdpbmRvdy5TaG9waWZ5ICYmIHdpbmRvdy5TaG9waWZ5LnByZXZpZXdfaG9zdDtcblxuICAgIGlmICh3aW5kb3cuaGlzdG9yeVxuICAgICAgJiYgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlXG4gICAgICAmJiB0aGlzLm9wdGlvbnMucHJvZHVjdFNldHRpbmdzLmVuYWJsZUhpc3RvcnlcbiAgICAgICYmICFpc1Nob3BpZnkpIHtcbiAgICAgIHRoaXMuZW5hYmxlSGlzdG9yeSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIG9uVmFyaWFudENoYW5nZShjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSA+PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBvZmZWYXJpYW50Q2hhbmdlKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZSh0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSk7XG4gIH1cblxuICBfaW5pdCgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IuZm9yRWFjaChzZWxlY3RvciA9PiB0aGlzLl9zZXRTZWxlY3RMYWJlbChzZWxlY3RvcikpO1xuICAgIH1cbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMub3B0aW9ucy5zZWxlY3Rvci5mb3JFYWNoKHNlbGVjdG9yID0+IHNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuX3ZhcmlhbnRDaGFuZ2UoZXZlbnQpKSk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5vcHRpb25zLnNlbGVjdG9yLmZvckVhY2goc2VsZWN0b3IgPT4gc2VsZWN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZlbnQgPT4gdGhpcy5fdmFyaWFudENoYW5nZShldmVudCkpKTtcbiAgfVxuXG4gIF9zZXRTZWxlY3RMYWJlbChzZWxlY3QpIHtcbiAgICBpZiAoIXNlbGVjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyB2YWx1ZSwgcHJldmlvdXNTaWJsaW5nIH0gPSBzZWxlY3Q7XG5cbiAgICBwcmV2aW91c1NpYmxpbmcuaW5uZXJUZXh0ID0gdmFsdWU7XG4gIH1cblxuICBnZXRDdXJyZW50T3B0aW9ucygpIHtcbiAgICBjb25zdCBwcm9kdWN0T3B0aW9ucyA9IFtdO1xuICAgIGxldCBpbnB1dHMgPSB0aGlzLm9wdGlvbnMuc2VsZWN0b3I7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIGlucHV0cyA9IGZpbHRlcihpbnB1dHMsIGlucHV0ID0+IGlucHV0LmNoZWNrZWQpO1xuICAgIH1cblxuICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHByb2R1Y3RPcHRpb25zLnB1c2goaW5wdXQudmFsdWUpKTtcblxuICAgIHJldHVybiBwcm9kdWN0T3B0aW9ucztcbiAgfVxuXG4gIGdldFZhcmlhbnRGcm9tT3B0aW9ucyhwcm9kdWN0T3B0aW9ucykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucHJvZHVjdEpTT04udmFyaWFudHMgPT0gbnVsbCkgeyByZXR1cm47IH1cblxuICAgIGxldCBmb3VuZFZhcmlhbnQgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucHJvZHVjdEpTT04udmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLm9wdGlvbnMucHJvZHVjdEpTT04udmFyaWFudHNbaV07XG5cbiAgICAgIGNvbnN0IGlzTWF0Y2ggPSBwcm9kdWN0T3B0aW9ucy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YXJpYW50Lm9wdGlvbnNbaW5kZXhdID09PSB2YWx1ZSk7XG5cbiAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgIGZvdW5kVmFyaWFudCA9IHZhcmlhbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kVmFyaWFudDtcbiAgfVxuXG4gIF91cGRhdGVNYXN0ZXJTZWxlY3QodmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50ID09IG51bGwpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXG4gICAgZXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcbiAgICB0aGlzLm1hc3RlclNlbGVjdC52YWx1ZSA9IHZhcmlhbnQuaWQ7XG4gICAgdGhpcy5tYXN0ZXJTZWxlY3QuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBfdXBkYXRlUHJpY2UodmFyaWFudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFkZFRvQ2FydEJ1dHRvbixcbiAgICAgIHByaWNlRmllbGRzLFxuICAgICAgcHJvZHVjdFNldHRpbmdzLFxuICAgICAgdW5pdFByaWNlLFxuICAgICAgdGF4TGluZSxcbiAgICAgIHByb2R1Y3REZXRhaWxzLFxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCB1bml0UHJpY2VBbW91bnQgPSB1bml0UHJpY2UgPyB1bml0UHJpY2UucXVlcnlTZWxlY3RvcignW2RhdGEtdW5pdC1wcmljZS1hbW91bnRdJykgOiBudWxsO1xuICAgIGNvbnN0IHVuaXRQcmljZU1lYXN1cmUgPSB1bml0UHJpY2UgPyB1bml0UHJpY2UucXVlcnlTZWxlY3RvcignW2RhdGEtdW5pdC1wcmljZS1tZWFzdXJlXScpIDogbnVsbDtcbiAgICBjb25zdCB1bml0UHJpY2VRdWFudGl0eSA9IHVuaXRQcmljZSA/IHVuaXRQcmljZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LXByaWNlLXF1YW50aXR5XScpIDogbnVsbDtcblxuICAgIGlmICh2YXJpYW50KSB7XG4gICAgICAvLyBzdHJpcCBhbGwgb2YgdGhlIG9sZCBkYXRhIGF0dHJpYnV0ZXNcblxuICAgICAgcHJpY2VGaWVsZHMuZm9yRWFjaChwcmljZUZpZWxkID0+IHtcbiAgICAgICAgY29uc3QgbW9uZXlFbHMgPSBwcmljZUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb25leScpO1xuXG4gICAgICAgIG1vbmV5RWxzLmZvckVhY2gobW9uZXlFbCA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtb25leUVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG1vbmV5RWwuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUubmFtZS5pbmRleE9mKCdkYXRhLScpID4gLTEpIHtcbiAgICAgICAgICAgICAgbW9uZXlFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRheExpbmUpIHtcbiAgICAgICAgaWYgKHZhcmlhbnQudGF4YWJsZSkge1xuICAgICAgICAgIHRheExpbmUuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGF4TGluZS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFudC5hdmFpbGFibGUgJiYgIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0ZW1wbGF0ZS1wYXNzd29yZCcpKSB7XG4gICAgICAgIGFkZFRvQ2FydEJ1dHRvbi52YWx1ZSA9IHByb2R1Y3RTZXR0aW5ncy5hZGRUb0NhcnRUZXh0O1xuICAgICAgICBhZGRUb0NhcnRCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgYWRkVG9DYXJ0QnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZFRvQ2FydEJ1dHRvbi52YWx1ZSA9IHByb2R1Y3RTZXR0aW5ncy5zb2xkT3V0VGV4dDtcbiAgICAgICAgYWRkVG9DYXJ0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgICAgIGFkZFRvQ2FydEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFudC5jb21wYXJlX2F0X3ByaWNlID4gdmFyaWFudC5wcmljZSkge1xuICAgICAgICBwcmljZUZpZWxkcy5mb3JFYWNoKHByaWNlRmllbGQgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vbmV5RWxzID0gcHJpY2VGaWVsZC5xdWVyeVNlbGVjdG9yQWxsKCcubW9uZXk6bm90KC5vcmlnaW5hbCknKTtcblxuICAgICAgICAgIG1vbmV5RWxzLmZvckVhY2gobW9uZXlFbCA9PiB7XG4gICAgICAgICAgICBtb25leUVsLmlubmVySFRNTCA9IHdpbmRvdy5UaGVtZS5DdXJyZW5jeS5mb3JtYXRNb25leSh2YXJpYW50LnByaWNlLCB3aW5kb3cuVGhlbWUubW9uZXlGb3JtYXQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJpY2VGaWVsZHMuZm9yRWFjaChwcmljZUZpZWxkID0+IHtcbiAgICAgICAgICBjb25zdCBtb25leUVscyA9IHByaWNlRmllbGQucXVlcnlTZWxlY3RvckFsbCgnLm1vbmV5Lm9yaWdpbmFsJyk7XG5cbiAgICAgICAgICBtb25leUVscy5mb3JFYWNoKG1vbmV5RWwgPT4ge1xuICAgICAgICAgICAgbW9uZXlFbC5pbm5lckhUTUwgPSB3aW5kb3cuVGhlbWUuQ3VycmVuY3kuZm9ybWF0TW9uZXkodmFyaWFudC5jb21wYXJlX2F0X3ByaWNlLCB3aW5kb3cuVGhlbWUubW9uZXlGb3JtYXQpO1xuICAgICAgICAgICAgbW9uZXlFbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpY2VGaWVsZHMuZm9yRWFjaChwcmljZUZpZWxkID0+IHtcbiAgICAgICAgICBjb25zdCBtb25leUVscyA9IHByaWNlRmllbGQucXVlcnlTZWxlY3RvckFsbCgnLm1vbmV5Jyk7XG5cbiAgICAgICAgICBtb25leUVscy5mb3JFYWNoKG1vbmV5RWwgPT4ge1xuICAgICAgICAgICAgbW9uZXlFbC5pbm5lckhUTUwgPSB3aW5kb3cuVGhlbWUuQ3VycmVuY3kuZm9ybWF0TW9uZXkodmFyaWFudC5wcmljZSwgd2luZG93LlRoZW1lLm1vbmV5Rm9ybWF0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByaWNlRmllbGRzLmZvckVhY2gocHJpY2VGaWVsZCA9PiB7XG4gICAgICAgICAgY29uc3QgbW9uZXlFbHMgPSBwcmljZUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb25leS5vcmlnaW5hbCcpO1xuXG4gICAgICAgICAgbW9uZXlFbHMuZm9yRWFjaChtb25leUVsID0+IHtcbiAgICAgICAgICAgIG1vbmV5RWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhbnQudW5pdF9wcmljZSkge1xuICAgICAgICB1bml0UHJpY2UuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgIGlmICh1bml0UHJpY2VRdWFudGl0eSkge1xuICAgICAgICAgIHVuaXRQcmljZVF1YW50aXR5LmlubmVySFRNTCA9IGAke3ZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5xdWFudGl0eV92YWx1ZX0ke3ZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5xdWFudGl0eV91bml0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdFByaWNlQW1vdW50KSB7XG4gICAgICAgICAgdW5pdFByaWNlQW1vdW50LmlubmVySFRNTCA9IHdpbmRvdy5UaGVtZS5DdXJyZW5jeS5mb3JtYXRNb25leSh2YXJpYW50LnVuaXRfcHJpY2UsIFRoZW1lLm1vbmV5Rm9ybWF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bml0UHJpY2VNZWFzdXJlKSB7XG4gICAgICAgICAgaWYgKHZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdmFsdWUgIT09IDEpIHtcbiAgICAgICAgICAgIHVuaXRQcmljZU1lYXN1cmUuaW5uZXJIVE1MID0gYCR7dmFyaWFudC51bml0X3ByaWNlX21lYXN1cmVtZW50LnJlZmVyZW5jZV92YWx1ZX0ke3ZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdW5pdH1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0UHJpY2VNZWFzdXJlLmlubmVySFRNTCA9IHZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdW5pdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodW5pdFByaWNlKSB7XG4gICAgICAgIHVuaXRQcmljZS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVmFyaWFudCBkb2Vzbid0IGV4aXN0XG4gICAgICBhZGRUb0NhcnRCdXR0b24udmFsdWUgPSBwcm9kdWN0U2V0dGluZ3MudW5hdmFpbGFibGVUZXh0O1xuICAgICAgYWRkVG9DYXJ0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgICBhZGRUb0NhcnRCdXR0b24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW1hZ2VzKHZhcmlhbnQpIHtcbiAgICBjb25zdCBpbWFnZUlkID0gX19ndWFyZF9fKHZhcmlhbnQgIT0gbnVsbCA/IHZhcmlhbnQuZmVhdHVyZWRfaW1hZ2UgOiB1bmRlZmluZWQsIHggPT4geC5pZCk7XG4gICAgY29uc3QgaW1hZ2VQb3NpdGlvbiA9IF9fZ3VhcmRfXyh2YXJpYW50ICE9IG51bGwgPyB2YXJpYW50LmZlYXR1cmVkX2ltYWdlIDogdW5kZWZpbmVkLCB4MSA9PiB4MS5wb3NpdGlvbikgLSAxO1xuXG4gICAgdGhpcy5vcHRpb25zLnByb2R1Y3RHYWxsZXJ5LnNlbGVjdE1lZGlhQnlWYXJpYW50KHZhcmlhbnQpO1xuICB9XG5cbiAgX3VwZGF0ZUhpc3RvcnkodmFyaWFudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVIaXN0b3J5IHx8ICh2YXJpYW50ID09IG51bGwpKSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcoWz98Jl12YXJpYW50PSlbMC05XSsoJnswLDF9KScpO1xuXG4gICAgbGV0IHsgc2VhcmNoIH0gPSB3aW5kb3cubG9jYXRpb247XG5cbiAgICBpZiAoc2VhcmNoLm1hdGNoKHJlKSkge1xuICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UocmUsIGAkMSR7dmFyaWFudC5pZH0kMmApO1xuICAgIH0gZWxzZSBpZiAoc2VhcmNoLmluZGV4T2YoJz8nKSAhPT0gLTEpIHtcbiAgICAgIHNlYXJjaCArPSBgJnZhcmlhbnQ9JHt2YXJpYW50LmlkfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlYXJjaCArPSBgP3ZhcmlhbnQ9JHt2YXJpYW50LmlkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3VXJsID0gW1xuICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgJy8vJyxcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgIF07XG5cbiAgICBjb25zdCB2YXJpYW50VXJsID0gbmV3VXJsLmpvaW4oJycpO1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IHBhdGg6IHZhcmlhbnRVcmwgfSwgJycsIHZhcmlhbnRVcmwpO1xuICB9XG5cbiAgX3ZhcmlhbnRDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICB0aGlzLl9zZXRTZWxlY3RMYWJlbChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9kdWN0T3B0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudE9wdGlvbnMoKTtcbiAgICBjb25zdCB2YXJpYW50ID0gdGhpcy5nZXRWYXJpYW50RnJvbU9wdGlvbnMocHJvZHVjdE9wdGlvbnMpO1xuXG4gICAgdGhpcy5fdXBkYXRlTWFzdGVyU2VsZWN0KHZhcmlhbnQpO1xuICAgIHRoaXMuX3VwZGF0ZVByaWNlKHZhcmlhbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUltYWdlcyh2YXJpYW50KTtcbiAgICB0aGlzLl91cGRhdGVIaXN0b3J5KHZhcmlhbnQpO1xuICAgIHRoaXMuY2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2sodmFyaWFudCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9fZ3VhcmRfXyh2YWx1ZSwgdHJhbnNmb3JtKSB7XG4gIHJldHVybiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkgPyB0cmFuc2Zvcm0odmFsdWUpIDogdW5kZWZpbmVkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVpBO0FBYUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBM1JBO0FBQ0E7QUE0UkE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/VariantHelper.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/helpers/globals.js":
+/*!*******************************************!*\
+ !*** ./source/scripts/helpers/globals.js ***!
+ \*******************************************/
+/***/ (() => {
+
+eval("/**\n * Currency Helpers\n *\n * Current contents\n * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n *\n */\nwindow.Theme.Currency = (() => {\n const moneyFormat = '${{amount}}'; // eslint-disable-line no-template-curly-in-string\n\n function formatMoney(cents, format) {\n if (typeof cents === 'string') {\n cents = cents.replace('.', '');\n }\n\n let value = '';\n const placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n const formatString = format || moneyFormat;\n\n function formatWithDelimiters(number, precision, thousands, decimal) {\n thousands = thousands || ',';\n decimal = decimal || '.';\n\n if (isNaN(number) || number === null) {\n return 0;\n }\n\n number = (number / 100.0).toFixed(precision);\n const parts = number.split('.');\n const dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, `$1${thousands}`);\n const centsAmount = parts[1] ? decimal + parts[1] : '';\n return dollarsAmount + centsAmount;\n }\n\n switch (formatString.match(placeholderRegex)[1]) {\n case 'amount':\n value = formatWithDelimiters(cents, 2);\n break;\n\n case 'amount_no_decimals':\n value = formatWithDelimiters(cents, 0);\n break;\n\n case 'amount_with_comma_separator':\n value = formatWithDelimiters(cents, 2, '.', ',');\n break;\n\n case 'amount_no_decimals_with_comma_separator':\n value = formatWithDelimiters(cents, 0, '.', ',');\n break;\n\n case 'amount_no_decimals_with_space_separator':\n value = formatWithDelimiters(cents, 0, ' ');\n break;\n\n case 'amount_with_apostrophe_separator':\n value = formatWithDelimiters(cents, 2, \"'\");\n break;\n\n default:\n break;\n }\n\n return formatString.replace(placeholderRegex, value);\n }\n\n return {\n formatMoney\n };\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9nbG9iYWxzLmpzP2VlNjUiXSwibmFtZXMiOlsid2luZG93IiwiVGhlbWUiLCJDdXJyZW5jeSIsIm1vbmV5Rm9ybWF0IiwiZm9ybWF0TW9uZXkiLCJjZW50cyIsImZvcm1hdCIsInJlcGxhY2UiLCJ2YWx1ZSIsInBsYWNlaG9sZGVyUmVnZXgiLCJmb3JtYXRTdHJpbmciLCJmb3JtYXRXaXRoRGVsaW1pdGVycyIsIm51bWJlciIsInByZWNpc2lvbiIsInRob3VzYW5kcyIsImRlY2ltYWwiLCJpc05hTiIsInRvRml4ZWQiLCJwYXJ0cyIsInNwbGl0IiwiZG9sbGFyc0Ftb3VudCIsImNlbnRzQW1vdW50IiwibWF0Y2giXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUFBLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhQyxRQUFiLEdBQXdCLENBQUMsTUFBTTtBQUM3QixRQUFNQyxXQUFXLEdBQUcsYUFBcEIsQ0FENkIsQ0FDTTs7QUFFbkMsV0FBU0MsV0FBVCxDQUFxQkMsS0FBckIsRUFBNEJDLE1BQTVCLEVBQW9DO0FBQ2xDLFFBQUksT0FBT0QsS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3QkEsTUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNFLE9BQU4sQ0FBYyxHQUFkLEVBQW1CLEVBQW5CLENBQVI7QUFDRDs7QUFDRCxRQUFJQyxLQUFLLEdBQUcsRUFBWjtBQUNBLFVBQU1DLGdCQUFnQixHQUFHLHFCQUF6QjtBQUNBLFVBQU1DLFlBQVksR0FBR0osTUFBTSxJQUFJSCxXQUEvQjs7QUFFQSxhQUFTUSxvQkFBVCxDQUE4QkMsTUFBOUIsRUFBc0NDLFNBQXRDLEVBQWlEQyxTQUFqRCxFQUE0REMsT0FBNUQsRUFBcUU7QUFDbkVELE1BQUFBLFNBQVMsR0FBR0EsU0FBUyxJQUFJLEdBQXpCO0FBQ0FDLE1BQUFBLE9BQU8sR0FBR0EsT0FBTyxJQUFJLEdBQXJCOztBQUVBLFVBQUlDLEtBQUssQ0FBQ0osTUFBRCxDQUFMLElBQWlCQSxNQUFNLEtBQUssSUFBaEMsRUFBc0M7QUFDcEMsZUFBTyxDQUFQO0FBQ0Q7O0FBRURBLE1BQUFBLE1BQU0sR0FBRyxDQUFDQSxNQUFNLEdBQUcsS0FBVixFQUFpQkssT0FBakIsQ0FBeUJKLFNBQXpCLENBQVQ7QUFFQSxZQUFNSyxLQUFLLEdBQUdOLE1BQU0sQ0FBQ08sS0FBUCxDQUFhLEdBQWIsQ0FBZDtBQUNBLFlBQU1DLGFBQWEsR0FBR0YsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTWCxPQUFULENBQ3BCLDBCQURvQixFQUVuQixLQUFJTyxTQUFVLEVBRkssQ0FBdEI7QUFJQSxZQUFNTyxXQUFXLEdBQUdILEtBQUssQ0FBQyxDQUFELENBQUwsR0FBV0gsT0FBTyxHQUFHRyxLQUFLLENBQUMsQ0FBRCxDQUExQixHQUFnQyxFQUFwRDtBQUVBLGFBQU9FLGFBQWEsR0FBR0MsV0FBdkI7QUFDRDs7QUFFRCxZQUFRWCxZQUFZLENBQUNZLEtBQWIsQ0FBbUJiLGdCQUFuQixFQUFxQyxDQUFyQyxDQUFSO0FBQ0UsV0FBSyxRQUFMO0FBQ0VELFFBQUFBLEtBQUssR0FBR0csb0JBQW9CLENBQUNOLEtBQUQsRUFBUSxDQUFSLENBQTVCO0FBQ0E7O0FBQ0YsV0FBSyxvQkFBTDtBQUNFRyxRQUFBQSxLQUFLLEdBQUdHLG9CQUFvQixDQUFDTixLQUFELEVBQVEsQ0FBUixDQUE1QjtBQUNBOztBQUNGLFdBQUssNkJBQUw7QUFDRUcsUUFBQUEsS0FBSyxHQUFHRyxvQkFBb0IsQ0FBQ04sS0FBRCxFQUFRLENBQVIsRUFBVyxHQUFYLEVBQWdCLEdBQWhCLENBQTVCO0FBQ0E7O0FBQ0YsV0FBSyx5Q0FBTDtBQUNFRyxRQUFBQSxLQUFLLEdBQUdHLG9CQUFvQixDQUFDTixLQUFELEVBQVEsQ0FBUixFQUFXLEdBQVgsRUFBZ0IsR0FBaEIsQ0FBNUI7QUFDQTs7QUFDRixXQUFLLHlDQUFMO0FBQ0VHLFFBQUFBLEtBQUssR0FBR0csb0JBQW9CLENBQUNOLEtBQUQsRUFBUSxDQUFSLEVBQVcsR0FBWCxDQUE1QjtBQUNBOztBQUNGLFdBQUssa0NBQUw7QUFDRUcsUUFBQUEsS0FBSyxHQUFHRyxvQkFBb0IsQ0FBQ04sS0FBRCxFQUFRLENBQVIsRUFBVyxHQUFYLENBQTVCO0FBQ0E7O0FBQ0Y7QUFDRTtBQXBCSjs7QUF1QkEsV0FBT0ssWUFBWSxDQUFDSCxPQUFiLENBQXFCRSxnQkFBckIsRUFBdUNELEtBQXZDLENBQVA7QUFDRDs7QUFFRCxTQUFPO0FBQ0xKLElBQUFBO0FBREssR0FBUDtBQUdELENBNUR1QixHQUF4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3VycmVuY3kgSGVscGVyc1xuICpcbiAqIEN1cnJlbnQgY29udGVudHNcbiAqIC0gZm9ybWF0TW9uZXkgLSBUYWtlcyBhbiBhbW91bnQgaW4gY2VudHMgYW5kIHJldHVybnMgaXQgYXMgYSBmb3JtYXR0ZWQgZG9sbGFyIHZhbHVlLlxuICpcbiAqL1xuXG53aW5kb3cuVGhlbWUuQ3VycmVuY3kgPSAoKCkgPT4ge1xuICBjb25zdCBtb25leUZvcm1hdCA9ICcke3thbW91bnR9fSc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nXG5cbiAgZnVuY3Rpb24gZm9ybWF0TW9uZXkoY2VudHMsIGZvcm1hdCkge1xuICAgIGlmICh0eXBlb2YgY2VudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjZW50cyA9IGNlbnRzLnJlcGxhY2UoJy4nLCAnJyk7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUmVnZXggPSAvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vO1xuICAgIGNvbnN0IGZvcm1hdFN0cmluZyA9IGZvcm1hdCB8fCBtb25leUZvcm1hdDtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdFdpdGhEZWxpbWl0ZXJzKG51bWJlciwgcHJlY2lzaW9uLCB0aG91c2FuZHMsIGRlY2ltYWwpIHtcbiAgICAgIHRob3VzYW5kcyA9IHRob3VzYW5kcyB8fCAnLCc7XG4gICAgICBkZWNpbWFsID0gZGVjaW1hbCB8fCAnLic7XG5cbiAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyID0gKG51bWJlciAvIDEwMC4wKS50b0ZpeGVkKHByZWNpc2lvbik7XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gbnVtYmVyLnNwbGl0KCcuJyk7XG4gICAgICBjb25zdCBkb2xsYXJzQW1vdW50ID0gcGFydHNbMF0ucmVwbGFjZShcbiAgICAgICAgLyhcXGQpKD89KFxcZFxcZFxcZCkrKD8hXFxkKSkvZyxcbiAgICAgICAgYCQxJHt0aG91c2FuZHN9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBjZW50c0Ftb3VudCA9IHBhcnRzWzFdID8gZGVjaW1hbCArIHBhcnRzWzFdIDogJyc7XG5cbiAgICAgIHJldHVybiBkb2xsYXJzQW1vdW50ICsgY2VudHNBbW91bnQ7XG4gICAgfVxuXG4gICAgc3dpdGNoIChmb3JtYXRTdHJpbmcubWF0Y2gocGxhY2Vob2xkZXJSZWdleClbMV0pIHtcbiAgICAgIGNhc2UgJ2Ftb3VudCc6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Ftb3VudF9ub19kZWNpbWFscyc6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIsICcuJywgJywnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbW91bnRfbm9fZGVjaW1hbHNfd2l0aF9jb21tYV9zZXBhcmF0b3InOlxuICAgICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAwLCAnLicsICcsJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzX3dpdGhfc3BhY2Vfc2VwYXJhdG9yJzpcbiAgICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMCwgJyAnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbW91bnRfd2l0aF9hcG9zdHJvcGhlX3NlcGFyYXRvcic6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIsIFwiJ1wiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0U3RyaW5nLnJlcGxhY2UocGxhY2Vob2xkZXJSZWdleCwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXRNb25leSxcbiAgfTtcbn0pKCk7XG4iXSwiZmlsZSI6Ii4vc291cmNlL3NjcmlwdHMvaGVscGVycy9nbG9iYWxzLmpzLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/globals.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/helpers/polyfill-nodelist-foreach.js":
+/*!*************************************************************!*\
+ !*** ./source/scripts/helpers/polyfill-nodelist-foreach.js ***!
+ \*************************************************************/
+/***/ (() => {
+
+eval("if (window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9wb2x5ZmlsbC1ub2RlbGlzdC1mb3JlYWNoLmpzP2E4ZjkiXSwibmFtZXMiOlsid2luZG93IiwiTm9kZUxpc3QiLCJwcm90b3R5cGUiLCJmb3JFYWNoIiwiQXJyYXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLE1BQU0sQ0FBQ0MsUUFBUCxJQUFtQixDQUFDQSxRQUFRLENBQUNDLFNBQVQsQ0FBbUJDLE9BQTNDLEVBQW9EO0FBQ2xERixFQUFBQSxRQUFRLENBQUNDLFNBQVQsQ0FBbUJDLE9BQW5CLEdBQTZCQyxLQUFLLENBQUNGLFNBQU4sQ0FBZ0JDLE9BQTdDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAod2luZG93Lk5vZGVMaXN0ICYmICFOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCkge1xuICBOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xufVxuIl0sImZpbGUiOiIuL3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvcG9seWZpbGwtbm9kZWxpc3QtZm9yZWFjaC5qcy5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/polyfill-nodelist-foreach.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/helpers/youtubeIframeAPIHelper.js":
+/*!**********************************************************!*\
+ !*** ./source/scripts/helpers/youtubeIframeAPIHelper.js ***!
+ \**********************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ load)\n/* harmony export */ });\nlet apiReadyResolve = null;\nlet apiReady = null;\nfunction load() {\n if (apiReady) return apiReady;\n apiReady = new Promise(resolve => {\n apiReadyResolve = resolve;\n });\n\n if (window.onYouTubeIframeAPIReady) {\n // If onYouTubeIframeAPIReady is already defined, we need to call it\n const {\n onYouTubeIframeAPIReady\n } = window;\n\n window.onYouTubeIframeAPIReady = () => {\n onYouTubeIframeAPIReady();\n apiReadyResolve();\n };\n } else {\n window.onYouTubeIframeAPIReady = apiReadyResolve;\n }\n\n if (!document.querySelector('#youtube-api-script')) {\n const script = document.createElement('script');\n script.setAttribute('id', 'youtube-api-script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.youtube.com/iframe_api');\n document.body.appendChild(script);\n }\n\n if (window.YT && YT.loaded) {\n apiReadyResolve();\n }\n\n return apiReady;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL3lvdXR1YmVJZnJhbWVBUElIZWxwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy95b3V0dWJlSWZyYW1lQVBJSGVscGVyLmpzPzJkMWMiXSwic291cmNlc0NvbnRlbnQiOlsibGV0IGFwaVJlYWR5UmVzb2x2ZSA9IG51bGw7XG5sZXQgYXBpUmVhZHkgPSBudWxsO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkKCkge1xuICBpZiAoYXBpUmVhZHkpIHJldHVybiBhcGlSZWFkeTtcblxuICBhcGlSZWFkeSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGFwaVJlYWR5UmVzb2x2ZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIGlmICh3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkpIHtcbiAgICAvLyBJZiBvbllvdVR1YmVJZnJhbWVBUElSZWFkeSBpcyBhbHJlYWR5IGRlZmluZWQsIHdlIG5lZWQgdG8gY2FsbCBpdFxuICAgIGNvbnN0IHsgb25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkgfSA9IHdpbmRvdztcbiAgICB3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkgPSAoKSA9PiB7XG4gICAgICBvbllvdVR1YmVJZnJhbWVBUElSZWFkeSgpO1xuICAgICAgYXBpUmVhZHlSZXNvbHZlKCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkgPSBhcGlSZWFkeVJlc29sdmU7XG4gIH1cblxuICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN5b3V0dWJlLWFwaS1zY3JpcHQnKSkge1xuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnaWQnLCAneW91dHViZS1hcGktc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaScpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5ZVCAmJiBZVC5sb2FkZWQpIHtcbiAgICBhcGlSZWFkeVJlc29sdmUoKTtcbiAgfVxuXG4gIHJldHVybiBhcGlSZWFkeTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/youtubeIframeAPIHelper.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/polyfills/nodeListForEach.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/polyfills/nodeListForEach.js ***!
+ \*****************************************************/
+/***/ (() => {
+
+eval("// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach\n// Allows use of .forEach on NodeLists in browsers without native support\nif (window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvcG9seWZpbGxzL25vZGVMaXN0Rm9yRWFjaC5qcz9kNTQ0Il0sIm5hbWVzIjpbIndpbmRvdyIsIk5vZGVMaXN0IiwicHJvdG90eXBlIiwiZm9yRWFjaCIsIkFycmF5Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsSUFBSUEsTUFBTSxDQUFDQyxRQUFQLElBQW1CLENBQUNBLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQkMsT0FBM0MsRUFBb0Q7QUFDbERGLEVBQUFBLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQkMsT0FBbkIsR0FBNkJDLEtBQUssQ0FBQ0YsU0FBTixDQUFnQkMsT0FBN0M7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlTGlzdC9mb3JFYWNoXG4vLyBBbGxvd3MgdXNlIG9mIC5mb3JFYWNoIG9uIE5vZGVMaXN0cyBpbiBicm93c2VycyB3aXRob3V0IG5hdGl2ZSBzdXBwb3J0XG5pZiAod2luZG93Lk5vZGVMaXN0ICYmICFOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCkge1xuICBOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xufVxuIl0sImZpbGUiOiIuL3NvdXJjZS9zY3JpcHRzL3BvbHlmaWxscy9ub2RlTGlzdEZvckVhY2guanMuanMiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/polyfills/nodeListForEach.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/DynamicBlog.js":
+/*!************************************************!*\
+ !*** ./source/scripts/sections/DynamicBlog.js ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DynamicBlog)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers/FlickityA11yPatch */ \"./source/scripts/helpers/FlickityA11yPatch.js\");\n\n\n\nclass DynamicBlog {\n constructor(section) {\n this.container = 'data-blog-container';\n this.slide = '.home-blog-post';\n this.el = section.el;\n this.container = this.el.querySelector(`[${this.container}]`);\n this.flickity = null;\n this._flickity = this._flickity.bind(this);\n\n this._bindEvents();\n\n this._flickity();\n\n this.flickityA11yPatch = new _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_2__.default(this.container);\n }\n\n _bindEvents() {\n window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n }\n\n onSectionUnload() {\n window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n\n this._destroyFlickity();\n\n if (this.flickityA11yPatch) {\n this.flickityA11yPatch.unload();\n }\n }\n\n _flickity() {\n if (!this.container) return; // If larger than 'small', destroy Flickity and exit\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isSmall()) {\n this._destroyFlickity();\n\n return;\n } // If Flickity is initialised, exit\n\n\n if (this.flickity) {\n return;\n }\n\n this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.container, {\n cellAlign: 'left',\n cellSelector: this.slide,\n contain: true,\n prevNextButtons: false,\n pageDots: false,\n setGallerySize: false\n });\n\n this._flickityEvents();\n }\n\n _destroyFlickity() {\n if (this.flickity) {\n this.flickity.destroy();\n this.flickity = null;\n window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity), 10));\n this.container.removeEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n }\n }\n\n _flickityEvents() {\n // Check for tallest slide at start of transition\n this.flickity.on('cellSelect', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity)); // Check for tallest slide at end of transition\n\n this.flickity.on('settle', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n this.container.addEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity)); // Sets the Slider to the height of the first slide\n\n _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity);\n window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity), 10));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljQmxvZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljQmxvZy5qcz85OTdlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5pbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcbmltcG9ydCBGbGlja2l0eUExMXlQYXRjaCBmcm9tICcuLi9oZWxwZXJzL0ZsaWNraXR5QTExeVBhdGNoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0Jsb2cge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSAnZGF0YS1ibG9nLWNvbnRhaW5lcic7XG4gICAgdGhpcy5zbGlkZSA9ICcuaG9tZS1ibG9nLXBvc3QnO1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbJHt0aGlzLmNvbnRhaW5lcn1dYCk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG4gICAgdGhpcy5fZmxpY2tpdHkgPSB0aGlzLl9mbGlja2l0eS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICAgIHRoaXMuX2ZsaWNraXR5KCk7XG5cbiAgICB0aGlzLmZsaWNraXR5QTExeVBhdGNoID0gbmV3IEZsaWNraXR5QTExeVBhdGNoKHRoaXMuY29udGFpbmVyKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhlbWVVdGlscy5kZWJvdW5jZSh0aGlzLl9mbGlja2l0eSwgMTAwKSk7XG5cbiAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcblxuICAgIGlmICh0aGlzLmZsaWNraXR5QTExeVBhdGNoKSB7XG4gICAgICB0aGlzLmZsaWNraXR5QTExeVBhdGNoLnVubG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIF9mbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBJZiBsYXJnZXIgdGhhbiAnc21hbGwnLCBkZXN0cm95IEZsaWNraXR5IGFuZCBleGl0XG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzU21hbGwoKSkge1xuICAgICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgRmxpY2tpdHkgaXMgaW5pdGlhbGlzZWQsIGV4aXRcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy5jb250YWluZXIsIHtcbiAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgY2VsbFNlbGVjdG9yOiB0aGlzLnNsaWRlLFxuICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9mbGlja2l0eUV2ZW50cygpO1xuICB9XG5cbiAgX2Rlc3Ryb3lGbGlja2l0eSgpIHtcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5kZXN0cm95KCk7XG4gICAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UoKCkgPT4gdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5KSwgMTApKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuICAgIH1cbiAgfVxuXG4gIF9mbGlja2l0eUV2ZW50cygpIHtcbiAgICAvLyBDaGVjayBmb3IgdGFsbGVzdCBzbGlkZSBhdCBzdGFydCBvZiB0cmFuc2l0aW9uXG4gICAgdGhpcy5mbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHRhbGxlc3Qgc2xpZGUgYXQgZW5kIG9mIHRyYW5zaXRpb25cbiAgICB0aGlzLmZsaWNraXR5Lm9uKCdzZXR0bGUnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcblxuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuXG4gICAgLy8gU2V0cyB0aGUgU2xpZGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHNsaWRlXG4gICAgdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5KTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKCgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSksIDEwKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQS9FQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicBlog.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/DynamicFeaturedCollection.js":
+/*!**************************************************************!*\
+ !*** ./source/scripts/sections/DynamicFeaturedCollection.js ***!
+ \**************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DynamicFeaturedCollection)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n/* harmony import */ var _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../helpers/FlickityA11yPatch */ \"./source/scripts/helpers/FlickityA11yPatch.js\");\n\n\n\n\nclass DynamicFeaturedCollection {\n constructor(section) {\n this.el = section.el;\n this._flickity = this._flickity.bind(this);\n this._destroyFlickity = this._destroyFlickity.bind(this);\n this.productViews = [];\n this.container = this.el.querySelector('[data-products-container]');\n this.slide = '.product-list-item';\n this.flickity = null;\n\n this._bindEvents();\n\n this._setupProducts();\n\n this._flickity();\n\n this.flickityA11yPatch = new _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_3__.default(this.container);\n }\n\n onSectionUnload() {\n window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n\n this._destroyFlickity();\n\n if (this.flickityA11yPatch) {\n this.flickityA11yPatch.unload();\n }\n\n if (this.productViews.length) {\n // Destroy existing view listeners\n this.productViews.map(productView => {\n productView.remove();\n });\n }\n }\n\n _bindEvents() {\n window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n }\n\n _setupProducts() {\n this.el.querySelectorAll('.product-list-item').forEach(productItem => this.productViews.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__.default({\n el: productItem\n })));\n }\n\n _flickity() {\n if (!this.container) {\n return;\n } // If larger than 'small', destroy Flickity and exit\n\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isSmall()) {\n this._destroyFlickity();\n\n return;\n } // If Flickity is initialised, exit\n\n\n if (this.flickity) {\n return;\n }\n\n this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.container, {\n cellAlign: 'left',\n cellSelector: this.slide,\n contain: true,\n prevNextButtons: false,\n pageDots: false,\n setGallerySize: false\n });\n\n this._flickityEvents();\n }\n\n _destroyFlickity() {\n if (this.flickity) {\n this.flickity.destroy();\n this.flickity = null;\n window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => {\n const event = new Event('home-featured-collections-height', {\n bubbles: true,\n cancelable: true\n });\n this.container.dispatchEvent(event);\n }, 10));\n\n if (this.flickity) {\n this.container.removeEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n }\n\n this.container.removeEventListener('home-featured-collections-height', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n }\n }\n\n _flickityEvents() {\n const event = new Event('home-featured-collections-height', {\n bubbles: true,\n cancelable: true\n }); // Check for tallest slide at start of transition\n\n this.flickity.on('cellSelect', () => this.container.dispatchEvent(event)); // Check for tallest slide at end of transition\n\n this.flickity.on('settle', () => this.container.dispatchEvent(event));\n\n if (this.flickity) {\n this.container.addEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n }\n\n this.container.addEventListener('home-featured-collections-height', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity)); // Sets the Slider to the height of the first slide\n\n this.container.dispatchEvent(event);\n window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => this.container.dispatchEvent(event), 10));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljRmVhdHVyZWRDb2xsZWN0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNGZWF0dXJlZENvbGxlY3Rpb24uanM/ZTUyYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5pbXBvcnQgUHJvZHVjdExpc3RJdGVtIGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdExpc3RJdGVtJztcbmltcG9ydCBGbGlja2l0eUExMXlQYXRjaCBmcm9tICcuLi9oZWxwZXJzL0ZsaWNraXR5QTExeVBhdGNoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLl9mbGlja2l0eSA9IHRoaXMuX2ZsaWNraXR5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fZGVzdHJveUZsaWNraXR5ID0gdGhpcy5fZGVzdHJveUZsaWNraXR5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9kdWN0Vmlld3MgPSBbXTtcbiAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdHMtY29udGFpbmVyXScpO1xuICAgIHRoaXMuc2xpZGUgPSAnLnByb2R1Y3QtbGlzdC1pdGVtJztcbiAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB0aGlzLl9zZXR1cFByb2R1Y3RzKCk7XG4gICAgdGhpcy5fZmxpY2tpdHkoKTtcblxuICAgIHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2ggPSBuZXcgRmxpY2tpdHlBMTF5UGF0Y2godGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuXG4gICAgaWYgKHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2gpIHtcbiAgICAgIHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2gudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvZHVjdFZpZXdzLmxlbmd0aCkge1xuICAgICAgLy8gRGVzdHJveSBleGlzdGluZyB2aWV3IGxpc3RlbmVyc1xuICAgICAgdGhpcy5wcm9kdWN0Vmlld3MubWFwKChwcm9kdWN0VmlldykgPT4ge1xuICAgICAgICBwcm9kdWN0Vmlldy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgfVxuXG4gIF9zZXR1cFByb2R1Y3RzKCkge1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLnByb2R1Y3QtbGlzdC1pdGVtJykuZm9yRWFjaChwcm9kdWN0SXRlbSA9PiB0aGlzLnByb2R1Y3RWaWV3cy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdEl0ZW0gfSkpKTtcbiAgfVxuXG4gIF9mbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7IHJldHVybjsgfVxuXG4gICAgLy8gSWYgbGFyZ2VyIHRoYW4gJ3NtYWxsJywgZGVzdHJveSBGbGlja2l0eSBhbmQgZXhpdFxuICAgIGlmICghdGhlbWVVdGlscy5pc1NtYWxsKCkpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIEZsaWNraXR5IGlzIGluaXRpYWxpc2VkLCBleGl0XG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuY29udGFpbmVyLCB7XG4gICAgICBjZWxsQWxpZ246ICdsZWZ0JyxcbiAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zbGlkZSxcbiAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICBwcmV2TmV4dEJ1dHRvbnM6IGZhbHNlLFxuICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgc2V0R2FsbGVyeVNpemU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fZmxpY2tpdHlFdmVudHMoKTtcbiAgfVxuXG4gIF9kZXN0cm95RmxpY2tpdHkoKSB7XG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHRoaXMuZmxpY2tpdHkuZGVzdHJveSgpO1xuICAgICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2hvbWUtZmVhdHVyZWQtY29sbGVjdGlvbnMtaGVpZ2h0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH0sIDEwKSk7XG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignaG9tZS1mZWF0dXJlZC1jb2xsZWN0aW9ucy1oZWlnaHQnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcbiAgICB9XG4gIH1cblxuICBfZmxpY2tpdHlFdmVudHMoKSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2hvbWUtZmVhdHVyZWQtY29sbGVjdGlvbnMtaGVpZ2h0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHRhbGxlc3Qgc2xpZGUgYXQgc3RhcnQgb2YgdHJhbnNpdGlvblxuICAgIHRoaXMuZmxpY2tpdHkub24oJ2NlbGxTZWxlY3QnLCAoKSA9PiB0aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KSk7XG5cbiAgICAvLyBDaGVjayBmb3IgdGFsbGVzdCBzbGlkZSBhdCBlbmQgb2YgdHJhbnNpdGlvblxuICAgIHRoaXMuZmxpY2tpdHkub24oJ3NldHRsZScsICgpID0+IHRoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpKTtcblxuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdob21lLWZlYXR1cmVkLWNvbGxlY3Rpb25zLWhlaWdodCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuXG4gICAgLy8gU2V0cyB0aGUgU2xpZGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHNsaWRlXG4gICAgdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhlbWVVdGlscy5kZWJvdW5jZSgoKSA9PiB0aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KSwgMTApKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBekdBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicFeaturedCollection.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/DynamicMasonry.js":
+/*!***************************************************!*\
+ !*** ./source/scripts/sections/DynamicMasonry.js ***!
+ \***************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DynamicMasonry)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryVideo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryVideo */ \"./source/scripts/components/MasonryVideo.js\");\n\nclass DynamicMasonry {\n constructor(section) {\n this.el = section.el;\n this.masonryVideo = null;\n this.urls = this.el.querySelectorAll('[data-masonry-url]');\n this.videos = this.el.querySelectorAll('[data-masonry-video]');\n this._redirectMasonryFeatures = this._redirectMasonryFeatures.bind(this);\n this._masonryVideo = this._masonryVideo.bind(this);\n\n this._bindEvents();\n }\n\n _bindEvents() {\n this.urls.forEach(url => url.addEventListener('click', event => this._redirectMasonryFeatures(event)));\n this.videos.forEach(video => video.addEventListener('click', event => this._masonryVideo(event)));\n }\n\n onSectionUnload() {\n if (this.masonryVideo != null) {\n this.masonryVideo.remove();\n }\n\n this.urls.forEach(url => url.removeEventListener('click', event => this._redirectMasonryFeatures(event)));\n this.videos.forEach(video => video.removeEventListener('click', event => this._masonryVideo(event)));\n }\n\n _redirectMasonryFeatures(e) {\n const {\n currentTarget\n } = e;\n if (!this.el.contains(currentTarget)) return;\n const {\n masonryUrl\n } = currentTarget.dataset;\n\n if (masonryUrl !== '') {\n window.location = masonryUrl;\n }\n }\n\n _masonryVideo(event) {\n this.masonryVideo = new _components_MasonryVideo__WEBPACK_IMPORTED_MODULE_0__.default(this.el, event);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljTWFzb25yeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljTWFzb25yeS5qcz84NTFjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXNvbnJ5VmlkZW8gZnJvbSAnLi4vY29tcG9uZW50cy9NYXNvbnJ5VmlkZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeW5hbWljTWFzb25yeSB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLm1hc29ucnlWaWRlbyA9IG51bGw7XG4gICAgdGhpcy51cmxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tYXNvbnJ5LXVybF0nKTtcbiAgICB0aGlzLnZpZGVvcyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbWFzb25yeS12aWRlb10nKTtcblxuICAgIHRoaXMuX3JlZGlyZWN0TWFzb25yeUZlYXR1cmVzID0gdGhpcy5fcmVkaXJlY3RNYXNvbnJ5RmVhdHVyZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9tYXNvbnJ5VmlkZW8gPSB0aGlzLl9tYXNvbnJ5VmlkZW8uYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMudXJscy5mb3JFYWNoKHVybCA9PiB1cmwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl9yZWRpcmVjdE1hc29ucnlGZWF0dXJlcyhldmVudCkpKTtcbiAgICB0aGlzLnZpZGVvcy5mb3JFYWNoKHZpZGVvID0+IHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5fbWFzb25yeVZpZGVvKGV2ZW50KSkpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGlmICh0aGlzLm1hc29ucnlWaWRlbyAhPSBudWxsKSB7XG4gICAgICB0aGlzLm1hc29ucnlWaWRlby5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy51cmxzLmZvckVhY2godXJsID0+IHVybC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuX3JlZGlyZWN0TWFzb25yeUZlYXR1cmVzKGV2ZW50KSkpO1xuICAgIHRoaXMudmlkZW9zLmZvckVhY2godmlkZW8gPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl9tYXNvbnJ5VmlkZW8oZXZlbnQpKSk7XG4gIH1cblxuICBfcmVkaXJlY3RNYXNvbnJ5RmVhdHVyZXMoZSkge1xuICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZTtcblxuICAgIGlmICghdGhpcy5lbC5jb250YWlucyhjdXJyZW50VGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBtYXNvbnJ5VXJsIH0gPSBjdXJyZW50VGFyZ2V0LmRhdGFzZXQ7XG5cbiAgICBpZiAobWFzb25yeVVybCAhPT0gJycpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IG1hc29ucnlVcmw7XG4gICAgfVxuICB9XG5cbiAgX21hc29ucnlWaWRlbyhldmVudCkge1xuICAgIHRoaXMubWFzb25yeVZpZGVvID0gbmV3IE1hc29ucnlWaWRlbyh0aGlzLmVsLCBldmVudCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6Q0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicMasonry.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/DynamicPromotion.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/sections/DynamicPromotion.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DynamicPromotion)\n/* harmony export */ });\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\nclass DynamicPromotion {\n constructor(section) {\n this.el = section.el;\n this.adjustHeight = this.adjustHeight.bind(this);\n this._headerOffset = this._headerOffset.bind(this);\n this.header = document.querySelector('[data-section-header]');\n this.parent = this.el.parentElement;\n this.wrapper = this.el.querySelector('[data-promotion-wrapper]');\n this.content = this.el.querySelector('[data-promotion-content]');\n this.image = this.el.querySelector('[data-promotion-image]');\n this.imageContainer = this.el.querySelector('[data-promotion-image-container]');\n this.isFullScreen = section.data.layout === 'full-screen';\n\n this._bindEvents();\n\n return this.adjustHeight();\n }\n\n remove() {\n window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 100));\n window.removeEventListener('scroll', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 10));\n }\n\n onSectionUnload() {\n this.remove();\n }\n\n onSectionReorder() {\n return this._headerOffset();\n }\n\n adjustHeight() {\n const heights = []; // An image can be shorter than text\n\n if (this.imageContainer) {\n if (this.content) {\n heights.push(this.content.getBoundingClientRect().height);\n }\n\n if (this.image) {\n heights.push(this.image.getBoundingClientRect().height);\n }\n\n const minHeight = Math.max.apply(null, heights);\n this.imageContainer.style.minHeight = `${minHeight}px`;\n }\n\n return this._headerOffset();\n }\n\n _bindEvents() {\n window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 100));\n window.addEventListener('scroll', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 10));\n } // Adjust container to compensate for header height if its in viewport\n\n\n _headerOffset() {\n let newHeight;\n\n if (!this.isFullScreen || !this.header) {\n return;\n }\n\n const headerHeight = this.header.getBoundingClientRect().height;\n const headerScrolledHeight = this.header.querySelector('.navigation').getBoundingClientRect().height;\n const isFirstChild = this.parent.previousElementSibling === null;\n const isStickyEnabled = document.body.classList.contains('sticky-header');\n const maxHeight = window.innerHeight;\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.isMedium()) {\n this.wrapper.style.height = '';\n } // If is first child, always make it full screen minus header height\n\n\n if (isFirstChild) {\n newHeight = maxHeight - headerHeight;\n this.wrapper.style.height = `${newHeight}px`; // Otherwise, if its larger than tablet, and sticky is enabled, take off nav height\n }\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.isMedium() && isStickyEnabled) {\n newHeight = maxHeight - headerScrolledHeight;\n this.wrapper.style.height = `${newHeight}px`; // Is not tablet, and header is not sticky, remove offset\n }\n\n this.wrapper.style.height = '';\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljUHJvbW90aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNQcm9tb3Rpb24uanM/ODA0MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY1Byb21vdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmFkanVzdEhlaWdodCA9IHRoaXMuYWRqdXN0SGVpZ2h0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5faGVhZGVyT2Zmc2V0ID0gdGhpcy5faGVhZGVyT2Zmc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLWhlYWRlcl0nKTtcbiAgICB0aGlzLnBhcmVudCA9IHRoaXMuZWwucGFyZW50RWxlbWVudDtcbiAgICB0aGlzLndyYXBwZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb21vdGlvbi13cmFwcGVyXScpO1xuICAgIHRoaXMuY29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvbW90aW9uLWNvbnRlbnRdJyk7XG4gICAgdGhpcy5pbWFnZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvbW90aW9uLWltYWdlXScpO1xuICAgIHRoaXMuaW1hZ2VDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb21vdGlvbi1pbWFnZS1jb250YWluZXJdJyk7XG5cbiAgICB0aGlzLmlzRnVsbFNjcmVlbiA9IHNlY3Rpb24uZGF0YS5sYXlvdXQgPT09ICdmdWxsLXNjcmVlbic7XG5cbiAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuYWRqdXN0SGVpZ2h0KCk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UodGhpcy5hZGp1c3RIZWlnaHQsIDEwMCkpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuYWRqdXN0SGVpZ2h0LCAxMCkpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBvblNlY3Rpb25SZW9yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJPZmZzZXQoKTtcbiAgfVxuXG4gIGFkanVzdEhlaWdodCgpIHtcbiAgICBjb25zdCBoZWlnaHRzID0gW107XG5cbiAgICAvLyBBbiBpbWFnZSBjYW4gYmUgc2hvcnRlciB0aGFuIHRleHRcbiAgICBpZiAodGhpcy5pbWFnZUNvbnRhaW5lcikge1xuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICBoZWlnaHRzLnB1c2godGhpcy5jb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgIGhlaWdodHMucHVzaCh0aGlzLmltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuXG4gICAgICB0aGlzLmltYWdlQ29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IGAke21pbkhlaWdodH1weGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlck9mZnNldCgpO1xuICB9XG5cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UodGhpcy5hZGp1c3RIZWlnaHQsIDEwMCkpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuYWRqdXN0SGVpZ2h0LCAxMCkpO1xuICB9XG5cbiAgLy8gQWRqdXN0IGNvbnRhaW5lciB0byBjb21wZW5zYXRlIGZvciBoZWFkZXIgaGVpZ2h0IGlmIGl0cyBpbiB2aWV3cG9ydFxuICBfaGVhZGVyT2Zmc2V0KCkge1xuICAgIGxldCBuZXdIZWlnaHQ7XG4gICAgaWYgKCF0aGlzLmlzRnVsbFNjcmVlbiB8fCAhdGhpcy5oZWFkZXIpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgY29uc3QgaGVhZGVyU2Nyb2xsZWRIZWlnaHQgPSB0aGlzLmhlYWRlci5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBjb25zdCBpc0ZpcnN0Q2hpbGQgPSB0aGlzLnBhcmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09PSBudWxsO1xuICAgIGNvbnN0IGlzU3RpY2t5RW5hYmxlZCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3ktaGVhZGVyJyk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgaWYgKHRoZW1lVXRpbHMuaXNNZWRpdW0oKSkge1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIH1cblxuICAgIC8vIElmIGlzIGZpcnN0IGNoaWxkLCBhbHdheXMgbWFrZSBpdCBmdWxsIHNjcmVlbiBtaW51cyBoZWFkZXIgaGVpZ2h0XG4gICAgaWYgKGlzRmlyc3RDaGlsZCkge1xuICAgICAgbmV3SGVpZ2h0ID0gbWF4SGVpZ2h0IC0gaGVhZGVySGVpZ2h0O1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgaWYgaXRzIGxhcmdlciB0aGFuIHRhYmxldCwgYW5kIHN0aWNreSBpcyBlbmFibGVkLCB0YWtlIG9mZiBuYXYgaGVpZ2h0XG4gICAgfSBpZiAoIXRoZW1lVXRpbHMuaXNNZWRpdW0oKSAmJiBpc1N0aWNreUVuYWJsZWQpIHtcbiAgICAgIG5ld0hlaWdodCA9IG1heEhlaWdodCAtIGhlYWRlclNjcm9sbGVkSGVpZ2h0O1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG5cbiAgICAgIC8vIElzIG5vdCB0YWJsZXQsIGFuZCBoZWFkZXIgaXMgbm90IHN0aWNreSwgcmVtb3ZlIG9mZnNldFxuICAgIH1cblxuICAgIHRoaXMud3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnJztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkZBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicPromotion.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/DynamicSlideshow.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/sections/DynamicSlideshow.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DynamicSlideshow)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers/FlickityA11yPatch */ \"./source/scripts/helpers/FlickityA11yPatch.js\");\n\n\nclass DynamicSlideshow {\n constructor(section) {\n this.el = section.el;\n this.slideshow = this.el.querySelector('[data-slideshow]');\n this.flickity = null;\n this.slideCount = this.slideshow.querySelectorAll('[data-slideshow-slide]').length;\n this.autoplay = section.data.autoplay ? section.data.autoplay : null;\n this.autoplayHoverPause = this.autoplay ? section.data.autoplayHoverPause : false;\n this.autoplayDelay = this.autoplay ? section.data.autoplayDelay * 1000 : null;\n this._resizeFlickity = this._resizeFlickity.bind(this);\n\n this._setupSlideshow();\n\n this.flickityA11yPatch = new _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_1__.default(this.slideshow);\n }\n\n onSectionUnload() {\n if (this.flickity) {\n this.slideshow.removeEventListener('rimg:load', this._resizeFlickity);\n this.flickity.destroy();\n this.flickity = null;\n }\n\n if (this.flickityA11yPatch) {\n this.flickityA11yPatch.unload();\n }\n }\n\n onSectionBlockSelect(block) {\n if (!this.flickity) {\n return;\n }\n\n const slideIndex = parseInt(block.el.dataset.slideIndex, 10);\n this.flickity.select(slideIndex, true);\n\n if (this.autoplay) {\n this.flickity.stopPlayer();\n }\n }\n\n onSectionBlockDeselect(block) {\n if (this.autoplay) {\n this.flickity.playPlayer();\n }\n }\n\n _setupSlideshow() {\n if (this.slideCount > 1) {\n this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.slideshow, {\n adaptiveHeight: true,\n autoPlay: this.autoplayDelay,\n cellSelector: '[data-slideshow-slide]',\n pageDots: true,\n pauseAutoPlayOnHover: this.autoplayHoverPause,\n prevNextButtons: true,\n resize: true,\n wrapAround: true,\n draggable: true\n });\n this.slideshow.addEventListener('rimg:load', this._resizeFlickity);\n }\n }\n\n _resizeFlickity() {\n if (this.flickity) {\n this.flickity.resize();\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljU2xpZGVzaG93LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNTbGlkZXNob3cuanM/MzM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IEZsaWNraXR5QTExeVBhdGNoIGZyb20gJy4uL2hlbHBlcnMvRmxpY2tpdHlBMTF5UGF0Y2gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeW5hbWljU2xpZGVzaG93IHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuc2xpZGVzaG93ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zbGlkZXNob3ddJyk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG4gICAgdGhpcy5zbGlkZUNvdW50ID0gdGhpcy5zbGlkZXNob3cucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc2xpZGVzaG93LXNsaWRlXScpLmxlbmd0aDtcbiAgICB0aGlzLmF1dG9wbGF5ID0gc2VjdGlvbi5kYXRhLmF1dG9wbGF5ID8gc2VjdGlvbi5kYXRhLmF1dG9wbGF5IDogbnVsbDtcbiAgICB0aGlzLmF1dG9wbGF5SG92ZXJQYXVzZSA9IHRoaXMuYXV0b3BsYXkgPyBzZWN0aW9uLmRhdGEuYXV0b3BsYXlIb3ZlclBhdXNlIDogZmFsc2U7XG4gICAgdGhpcy5hdXRvcGxheURlbGF5ID0gdGhpcy5hdXRvcGxheSA/IHNlY3Rpb24uZGF0YS5hdXRvcGxheURlbGF5ICogMTAwMCA6IG51bGw7XG4gICAgdGhpcy5fcmVzaXplRmxpY2tpdHkgPSB0aGlzLl9yZXNpemVGbGlja2l0eS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fc2V0dXBTbGlkZXNob3coKTtcblxuICAgIHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2ggPSBuZXcgRmxpY2tpdHlBMTF5UGF0Y2godGhpcy5zbGlkZXNob3cpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLnNsaWRlc2hvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCB0aGlzLl9yZXNpemVGbGlja2l0eSk7XG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsaWNraXR5QTExeVBhdGNoKSB7XG4gICAgICB0aGlzLmZsaWNraXR5QTExeVBhdGNoLnVubG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VjdGlvbkJsb2NrU2VsZWN0KGJsb2NrKSB7XG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHNsaWRlSW5kZXggPSBwYXJzZUludChibG9jay5lbC5kYXRhc2V0LnNsaWRlSW5kZXgsIDEwKTtcbiAgICB0aGlzLmZsaWNraXR5LnNlbGVjdChzbGlkZUluZGV4LCB0cnVlKTtcbiAgICBpZiAodGhpcy5hdXRvcGxheSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5zdG9wUGxheWVyKCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tEZXNlbGVjdChibG9jaykge1xuICAgIGlmICh0aGlzLmF1dG9wbGF5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LnBsYXlQbGF5ZXIoKTtcbiAgICB9XG4gIH1cblxuICBfc2V0dXBTbGlkZXNob3coKSB7XG4gICAgaWYgKHRoaXMuc2xpZGVDb3VudCA+IDEpIHtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy5zbGlkZXNob3csIHtcbiAgICAgICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgICAgIGF1dG9QbGF5OiB0aGlzLmF1dG9wbGF5RGVsYXksXG4gICAgICAgIGNlbGxTZWxlY3RvcjogJ1tkYXRhLXNsaWRlc2hvdy1zbGlkZV0nLFxuICAgICAgICBwYWdlRG90czogdHJ1ZSxcbiAgICAgICAgcGF1c2VBdXRvUGxheU9uSG92ZXI6IHRoaXMuYXV0b3BsYXlIb3ZlclBhdXNlLFxuICAgICAgICBwcmV2TmV4dEJ1dHRvbnM6IHRydWUsXG4gICAgICAgIHJlc2l6ZTogdHJ1ZSxcbiAgICAgICAgd3JhcEFyb3VuZDogdHJ1ZSxcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNsaWRlc2hvdy5hZGRFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCB0aGlzLl9yZXNpemVGbGlja2l0eSk7XG4gICAgfVxuICB9XG5cbiAgX3Jlc2l6ZUZsaWNraXR5KCkge1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBakVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicSlideshow.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/DynamicTestimonials.js":
+/*!********************************************************!*\
+ !*** ./source/scripts/sections/DynamicTestimonials.js ***!
+ \********************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DynamicTestimonials)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\nclass DynamicTestimonials {\n constructor(section) {\n this.el = section.el;\n this._flickity = this._flickity.bind(this);\n this.container = 'data-testimonials-container';\n this.slide = 'data-testimonial-item';\n this.testimonialsContainer = this.el.querySelector(`[${this.container}]`);\n this.flickity = null;\n\n this._flickity();\n\n this._bindEvents();\n }\n\n onSectionUnload() {\n this.remove();\n }\n\n remove() {\n window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n\n this._destroyFlickity();\n }\n\n _bindEvents() {\n window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n }\n\n _flickity() {\n if (!this.testimonialsContainer) return; // If larger than 'small', destroy Flickity and exit\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isSmall()) {\n this._destroyFlickity();\n\n return;\n } // If Flickity is initialised, exit\n\n\n if (this.flickity) {\n return;\n }\n\n this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.testimonialsContainer, {\n cellAlign: 'center',\n cellSelector: `[${this.slide}]`,\n contain: true,\n prevNextButtons: false,\n pageDots: false\n });\n }\n\n _destroyFlickity() {\n if (this.flickity) {\n this.flickity.destroy();\n this.flickity = null;\n }\n }\n\n onSectionBlockSelect(block) {\n if (!this.flickity) {\n return;\n }\n\n const {\n index\n } = block.el.dataset;\n this.flickity.select(index, true);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljVGVzdGltb25pYWxzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNUZXN0aW1vbmlhbHMuanM/MDIwZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNUZXN0aW1vbmlhbHMge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5fZmxpY2tpdHkgPSB0aGlzLl9mbGlja2l0eS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY29udGFpbmVyID0gJ2RhdGEtdGVzdGltb25pYWxzLWNvbnRhaW5lcic7XG4gICAgdGhpcy5zbGlkZSA9ICdkYXRhLXRlc3RpbW9uaWFsLWl0ZW0nO1xuICAgIHRoaXMudGVzdGltb25pYWxzQ29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbJHt0aGlzLmNvbnRhaW5lcn1dYCk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICB0aGlzLl9mbGlja2l0eSgpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgfVxuXG4gIF9mbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMudGVzdGltb25pYWxzQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBJZiBsYXJnZXIgdGhhbiAnc21hbGwnLCBkZXN0cm95IEZsaWNraXR5IGFuZCBleGl0XG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzU21hbGwoKSkge1xuICAgICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgRmxpY2tpdHkgaXMgaW5pdGlhbGlzZWQsIGV4aXRcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy50ZXN0aW1vbmlhbHNDb250YWluZXIsIHtcbiAgICAgIGNlbGxBbGlnbjogJ2NlbnRlcicsXG4gICAgICBjZWxsU2VsZWN0b3I6IGBbJHt0aGlzLnNsaWRlfV1gLFxuICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBfZGVzdHJveUZsaWNraXR5KCkge1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VjdGlvbkJsb2NrU2VsZWN0KGJsb2NrKSB7XG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgeyBpbmRleCB9ID0gYmxvY2suZWwuZGF0YXNldDtcblxuICAgIHRoaXMuZmxpY2tpdHkuc2VsZWN0KGluZGV4LCB0cnVlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQS9EQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicTestimonials.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/ProductSection.js":
+/*!***************************************************!*\
+ !*** ./source/scripts/sections/ProductSection.js ***!
+ \***************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ProductSection)\n/* harmony export */ });\n/* harmony import */ var _components_Product__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Product */ \"./source/scripts/components/Product.js\");\n\nclass ProductSection {\n constructor(section) {\n const {\n el,\n data,\n id\n } = section;\n this.product = new _components_Product__WEBPACK_IMPORTED_MODULE_0__.default(el, data, id);\n }\n\n onSectionUnload() {\n return this.product.unload();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9Qcm9kdWN0U2VjdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9Qcm9kdWN0U2VjdGlvbi5qcz8xYmE4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9kdWN0IGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RTZWN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIGNvbnN0IHsgZWwsIGRhdGEsIGlkIH0gPSBzZWN0aW9uO1xuXG4gICAgdGhpcy5wcm9kdWN0ID0gbmV3IFByb2R1Y3QoZWwsIGRhdGEsIGlkKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0LnVubG9hZCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/ProductSection.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticArticle.js":
+/*!**************************************************!*\
+ !*** ./source/scripts/sections/StaticArticle.js ***!
+ \**************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticArticle)\n/* harmony export */ });\nclass StaticArticle {\n constructor(section) {\n this.initializedClass = 'article-initialized';\n this.el = section.el;\n\n this._validate();\n }\n\n update() {\n this._validate();\n }\n\n onSectionUnload() {\n window.removeEventListener('resize', () => {\n this.setupFullWidthImages();\n\n if (window.innerWidth <= 1080) {\n this.positionSidebar('below');\n } else {\n this.positionSidebar();\n this.setupFeaturedImage();\n }\n });\n }\n\n _validate() {\n if (window.innerWidth <= 1080) {\n this.positionSidebar('below');\n } else {\n this.positionSidebar();\n }\n\n this.setupFeaturedImage();\n this.setupFullWidthImages();\n window.addEventListener('resize', () => {\n this.setupFullWidthImages();\n\n if (window.innerWidth <= 1080) {\n this.positionSidebar('below');\n } else {\n this.positionSidebar();\n this.setupFeaturedImage();\n }\n });\n }\n\n setupFeaturedImage() {\n const posts = this.el.querySelectorAll('.blog-post');\n posts.forEach(post => {\n const image = post.querySelector('img.highlight');\n\n if (image) {\n image.addEventListener('rimg:load', () => {\n post.querySelector('.blog-post-inner').style.paddingTop = `${image.getBoundingClientRect().height - 60}px`;\n });\n }\n });\n }\n\n setupFullWidthImages() {\n const postContent = this.el.querySelector('.post-content');\n const postContentWidth = postContent.getBoundingClientRect().width;\n const postContentMargin = postContent.style.marginLeft;\n this.el.querySelectorAll('img.full-width').forEach(image => {\n image.style.width = `${postContentWidth}px`;\n image.style.left = `-${postContentMargin}px`;\n });\n }\n\n positionSidebar(position) {\n const wrapper = this.el.querySelector('.blog-post-wrapper');\n const sidebar = this.el.querySelector('.blog-sidebar');\n\n if (position === 'below') {\n wrapper.parentNode.insertBefore(sidebar, wrapper.nextSibling);\n } else {\n wrapper.parentNode.insertBefore(sidebar, wrapper);\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNBcnRpY2xlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0FydGljbGUuanM/NzNjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNBcnRpY2xlIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWRDbGFzcyA9ICdhcnRpY2xlLWluaXRpYWxpemVkJztcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuX3ZhbGlkYXRlKCk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2V0dXBGdWxsV2lkdGhJbWFnZXMoKTtcbiAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDgwKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25TaWRlYmFyKCdiZWxvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cEZlYXR1cmVkSW1hZ2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF92YWxpZGF0ZSgpIHtcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gMTA4MCkge1xuICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zaXRpb25TaWRlYmFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cEZlYXR1cmVkSW1hZ2UoKTtcbiAgICB0aGlzLnNldHVwRnVsbFdpZHRoSW1hZ2VzKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXR1cEZ1bGxXaWR0aEltYWdlcygpO1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uU2lkZWJhcigpO1xuICAgICAgICB0aGlzLnNldHVwRmVhdHVyZWRJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0dXBGZWF0dXJlZEltYWdlKCkge1xuICAgIGNvbnN0IHBvc3RzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuYmxvZy1wb3N0Jyk7XG5cbiAgICBwb3N0cy5mb3JFYWNoKHBvc3QgPT4ge1xuICAgICAgY29uc3QgaW1hZ2UgPSBwb3N0LnF1ZXJ5U2VsZWN0b3IoJ2ltZy5oaWdobGlnaHQnKTtcblxuICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHtcbiAgICAgICAgICBwb3N0LnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLXBvc3QtaW5uZXInKS5zdHlsZS5wYWRkaW5nVG9wID0gYCR7aW1hZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gNjB9cHhgO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldHVwRnVsbFdpZHRoSW1hZ2VzKCkge1xuICAgIGNvbnN0IHBvc3RDb250ZW50ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucG9zdC1jb250ZW50Jyk7XG4gICAgY29uc3QgcG9zdENvbnRlbnRXaWR0aCA9IHBvc3RDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHBvc3RDb250ZW50TWFyZ2luID0gcG9zdENvbnRlbnQuc3R5bGUubWFyZ2luTGVmdDtcblxuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnaW1nLmZ1bGwtd2lkdGgnKS5mb3JFYWNoKGltYWdlID0+IHtcbiAgICAgIGltYWdlLnN0eWxlLndpZHRoID0gYCR7cG9zdENvbnRlbnRXaWR0aH1weGA7XG4gICAgICBpbWFnZS5zdHlsZS5sZWZ0ID0gYC0ke3Bvc3RDb250ZW50TWFyZ2lufXB4YDtcbiAgICB9KTtcbiAgfVxuXG4gIHBvc2l0aW9uU2lkZWJhcihwb3NpdGlvbikge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLXBvc3Qtd3JhcHBlcicpO1xuICAgIGNvbnN0IHNpZGViYXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLXNpZGViYXInKTtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ2JlbG93Jykge1xuICAgICAgd3JhcHBlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWRlYmFyLCB3cmFwcGVyLm5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JhcHBlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWRlYmFyLCB3cmFwcGVyKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvRUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticArticle.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticBlog.js":
+/*!***********************************************!*\
+ !*** ./source/scripts/sections/StaticBlog.js ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticBlog)\n/* harmony export */ });\n/* harmony import */ var _components_Select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Select */ \"./source/scripts/components/Select.js\");\n\nclass StaticBlog {\n constructor(section) {\n this.el = section.el;\n this.initializedClass = 'blog-initialized';\n\n this._validate();\n }\n\n onSectionLoad() {\n this._validate();\n }\n\n onSectionUnload() {\n window.removeEventListener('resize', () => {\n this.setupFullWidthImages();\n\n if (window.innerWidth <= 1080) {\n this.positionSidebar('below');\n } else {\n this.positionSidebar();\n this.setupFeaturedImage();\n }\n });\n const filterSelect = this.el.querySelector('.blog-tag-filter select');\n\n if (filterSelect) {\n filterSelect.removeEventListener('change', event => this.filterBlog(event));\n }\n }\n\n _validate() {\n if (window.innerWidth <= 1080) {\n this.positionSidebar('below');\n } else {\n this.positionSidebar();\n }\n\n this.setupFeaturedImage();\n this.setupFullWidthImages();\n window.addEventListener('resize', () => {\n this.setupFullWidthImages();\n\n if (window.innerWidth <= 1080) {\n this.positionSidebar('below');\n } else {\n this.positionSidebar();\n this.setupFeaturedImage();\n }\n });\n const filterSelect = this.el.querySelector('.blog-tag-filter select');\n\n if (filterSelect) {\n new _components_Select__WEBPACK_IMPORTED_MODULE_0__.default({\n el: filterSelect\n });\n filterSelect.addEventListener('change', event => this.filterBlog(event));\n }\n }\n\n filterBlog(e) {\n if (!this.el.querySelector('[data-tag-filter]')) {\n return;\n }\n\n const {\n tag,\n dataset\n } = e.target;\n const {\n url\n } = dataset;\n window.location.href = tag === 'all' ? `/blogs/${url}` : `/blogs/${url}/tagged/${tag}`;\n }\n\n setupFeaturedImage() {\n const posts = this.el.querySelectorAll('.blog-post');\n posts.forEach(post => {\n const image = post.querySelector('img.highlight');\n\n if (image) {\n image.addEventListener('rimg:load', () => {\n post.querySelector('.blog-post-inner').style.paddingTop = `${image.getBoundingClientRect().height - 60}px`;\n });\n }\n });\n }\n\n setupFullWidthImages() {\n const postContent = this.el.querySelector('.post-content');\n const postContentWidth = postContent.getBoundingClientRect().width;\n const postContentMargin = postContent.style.marginLeft;\n this.el.querySelectorAll('img.full-width').forEach(image => {\n image.style.width = `${postContentWidth}px`;\n image.style.left = `-${postContentMargin}px`;\n });\n }\n\n positionSidebar(position) {\n const wrapper = this.el.querySelector('.blog-posts');\n const sidebar = this.el.querySelector('.blog-sidebar');\n\n if (position === 'below') {\n wrapper.parentNode.insertBefore(sidebar, wrapper.nextSibling);\n } else {\n wrapper.parentNode.insertBefore(sidebar, wrapper);\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNCbG9nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0Jsb2cuanM/OWI3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VsZWN0IGZyb20gJy4uL2NvbXBvbmVudHMvU2VsZWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljQmxvZyB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2xhc3MgPSAnYmxvZy1pbml0aWFsaXplZCc7XG4gICAgdGhpcy5fdmFsaWRhdGUoKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkxvYWQoKSB7XG4gICAgdGhpcy5fdmFsaWRhdGUoKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXR1cEZ1bGxXaWR0aEltYWdlcygpO1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uU2lkZWJhcigpO1xuICAgICAgICB0aGlzLnNldHVwRmVhdHVyZWRJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyU2VsZWN0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYmxvZy10YWctZmlsdGVyIHNlbGVjdCcpO1xuXG4gICAgaWYgKGZpbHRlclNlbGVjdCkge1xuICAgICAgZmlsdGVyU2VsZWN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuZmlsdGVyQmxvZyhldmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIF92YWxpZGF0ZSgpIHtcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gMTA4MCkge1xuICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zaXRpb25TaWRlYmFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cEZlYXR1cmVkSW1hZ2UoKTtcbiAgICB0aGlzLnNldHVwRnVsbFdpZHRoSW1hZ2VzKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXR1cEZ1bGxXaWR0aEltYWdlcygpO1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uU2lkZWJhcigpO1xuICAgICAgICB0aGlzLnNldHVwRmVhdHVyZWRJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyU2VsZWN0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYmxvZy10YWctZmlsdGVyIHNlbGVjdCcpO1xuXG4gICAgaWYgKGZpbHRlclNlbGVjdCkge1xuICAgICAgbmV3IFNlbGVjdCh7IGVsOiBmaWx0ZXJTZWxlY3QgfSk7XG5cbiAgICAgIGZpbHRlclNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB0aGlzLmZpbHRlckJsb2coZXZlbnQpKTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJCbG9nKGUpIHtcbiAgICBpZiAoIXRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFnLWZpbHRlcl0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGFnLCBkYXRhc2V0IH0gPSBlLnRhcmdldDtcbiAgICBjb25zdCB7IHVybCB9ID0gZGF0YXNldDtcblxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGFnID09PSAnYWxsJ1xuICAgICAgPyBgL2Jsb2dzLyR7dXJsfWBcbiAgICAgIDogYC9ibG9ncy8ke3VybH0vdGFnZ2VkLyR7dGFnfWA7XG4gIH1cblxuICBzZXR1cEZlYXR1cmVkSW1hZ2UoKSB7XG4gICAgY29uc3QgcG9zdHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ibG9nLXBvc3QnKTtcblxuICAgIHBvc3RzLmZvckVhY2gocG9zdCA9PiB7XG4gICAgICBjb25zdCBpbWFnZSA9IHBvc3QucXVlcnlTZWxlY3RvcignaW1nLmhpZ2hsaWdodCcpO1xuXG4gICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcigncmltZzpsb2FkJywgKCkgPT4ge1xuICAgICAgICAgIHBvc3QucXVlcnlTZWxlY3RvcignLmJsb2ctcG9zdC1pbm5lcicpLnN0eWxlLnBhZGRpbmdUb3AgPSBgJHtpbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSA2MH1weGA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0dXBGdWxsV2lkdGhJbWFnZXMoKSB7XG4gICAgY29uc3QgcG9zdENvbnRlbnQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5wb3N0LWNvbnRlbnQnKTtcbiAgICBjb25zdCBwb3N0Q29udGVudFdpZHRoID0gcG9zdENvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgcG9zdENvbnRlbnRNYXJnaW4gPSBwb3N0Q29udGVudC5zdHlsZS5tYXJnaW5MZWZ0O1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcuZnVsbC13aWR0aCcpLmZvckVhY2goaW1hZ2UgPT4ge1xuICAgICAgaW1hZ2Uuc3R5bGUud2lkdGggPSBgJHtwb3N0Q29udGVudFdpZHRofXB4YDtcbiAgICAgIGltYWdlLnN0eWxlLmxlZnQgPSBgLSR7cG9zdENvbnRlbnRNYXJnaW59cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcG9zaXRpb25TaWRlYmFyKHBvc2l0aW9uKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmJsb2ctcG9zdHMnKTtcbiAgICBjb25zdCBzaWRlYmFyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYmxvZy1zaWRlYmFyJyk7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdiZWxvdycpIHtcbiAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2lkZWJhciwgd3JhcHBlci5uZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2lkZWJhciwgd3JhcHBlcik7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticBlog.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticBlogMasonry.js":
+/*!******************************************************!*\
+ !*** ./source/scripts/sections/StaticBlogMasonry.js ***!
+ \******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticBlogMasonry)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n\nclass StaticBlogMasonry {\n constructor({\n el\n }) {\n const masonry = el.querySelector('[data-masonry-grid]');\n this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n el: masonry\n });\n }\n\n onSectionUnload() {\n return this.masonryGrid.unload();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNCbG9nTWFzb25yeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNCbG9nTWFzb25yeS5qcz9jYTc4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXNvbnJ5R3JpZCBmcm9tICcuLi9jb21wb25lbnRzL01hc29ucnlHcmlkJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljQmxvZ01hc29ucnkge1xuICBjb25zdHJ1Y3Rvcih7IGVsIH0pIHtcbiAgICBjb25zdCBtYXNvbnJ5ID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS1ncmlkXScpO1xuXG4gICAgdGhpcy5tYXNvbnJ5R3JpZCA9IG5ldyBNYXNvbnJ5R3JpZCh7IGVsOiBtYXNvbnJ5IH0pO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHJldHVybiB0aGlzLm1hc29ucnlHcmlkLnVubG9hZCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticBlogMasonry.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticCart.js":
+/*!***********************************************!*\
+ !*** ./source/scripts/sections/StaticCart.js ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticCart)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var morphdom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! morphdom */ \"./node_modules/morphdom/dist/morphdom-esm.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @shopify/theme-addresses */ \"./node_modules/@shopify/theme-addresses/theme-addresses.js\");\n\n\n\n\nclass StaticCart {\n constructor(section) {\n this.el = section.el;\n this.cartTable = this.el.querySelector('[data-cart-table]');\n this.cartDiscountContainer = this.el.querySelector('[data-cart-discount-container]');\n this.totalPrice = this.el.querySelector('[data-total-price]');\n this.quantityInputs = null;\n this.removeItem = null;\n this.updateTimeout = null;\n this.initializedClass = 'cart-initialized';\n this.cartInstructionsTextarea = document.querySelector('.cart-instructions textarea');\n\n if (this.cartInstructionsTextarea) {\n this.cartInstructionsTextarea.addEventListener('change', () => this.saveSpecialInstructions());\n }\n\n this._bindCartItemEvents();\n\n const {\n hasShippingCalculator\n } = section.data;\n\n if (hasShippingCalculator) {\n const countrySelect = document.getElementById('address_country');\n const provinceSelect = document.getElementById('address_province');\n const provinceContainer = document.getElementById('address_province_container');\n if (!countrySelect) return;\n const observer = new MutationObserver(() => {\n this.shippingSelects.forEach(select => {\n const {\n previousElementSibling,\n options,\n selectedIndex\n } = select;\n if (!previousElementSibling || !options || !options.length) return;\n previousElementSibling.innerText = options[selectedIndex >= 0 ? selectedIndex : 0].text;\n });\n });\n this.shippingSubmit = this.el.querySelector('[data-shipping-calculator-submit]');\n\n this.calculateShipping = () => this._calculateShipping();\n\n this.shippingSelects = this.el.querySelectorAll('.cart-shipping-calculator select');\n this.shippingSelects.forEach(shippingSelect => observer.observe(shippingSelect, {\n childList: true\n }));\n this.shippingCountryProvinceSelector = new _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_3__.CountryProvinceSelector(countrySelect.innerHTML);\n this.shippingCountryProvinceSelector.build(countrySelect, provinceSelect, {\n onCountryChange: provinces => {\n if (provinces.length) {\n provinceContainer.style.display = 'block';\n } else {\n provinceContainer.style.display = 'none';\n } // \"Province\", \"State\", \"Region\", etc. and \"Postal Code\", \"ZIP Code\", etc.\n // Even countries without provinces include a label.\n\n\n const {\n label,\n zip_label: zipLabel\n } = window.Countries[countrySelect.value];\n provinceContainer.querySelector('label[for=\"address_province\"]').innerHTML = label;\n this.el.querySelector('label[for=\"address_zip\"]').innerHTML = zipLabel;\n }\n });\n this.shippingSubmit.addEventListener('click', this.calculateShipping);\n\n if (window.Theme.customerAddress) {\n this._calculateShipping(window.Theme.customerAddress);\n }\n }\n }\n\n _bindCartItemEvents() {\n this.quantityInputs = this.el.querySelectorAll('[data-quantity-key]');\n this.removeItem = this.el.querySelectorAll('[data-remove-item]');\n this.cartTable = this.el.querySelector('[data-cart-table]');\n this.cartDiscountContainer = this.el.querySelector('[data-cart-discount-container]');\n this.totalPrice = this.el.querySelector('[data-total-price]');\n this.quantityInputs.forEach(el => el.addEventListener('input', event => this._updateItemQuantity(event)));\n this.removeItem.forEach(el => el.addEventListener('click', event => this._updateItemQuantity(event)));\n }\n\n _unbindCartItemEvents() {\n this.quantityInputs.forEach(el => el.removeEventListener('input', event => this._updateItemQuantity(event)));\n this.removeItem.forEach(el => el.removeEventListener('click', event => this._updateItemQuantity(event)));\n this.quantityInputs = null;\n this.removeItem = null;\n }\n\n onSectionUnload() {\n this.shippingSubmit.removeEventListener('click', this.calculateShipping);\n\n if (this.cartInstructionsTextarea) {\n this.cartInstructionsTextarea.removeEventListener('change', () => this.saveSpecialInstructions());\n }\n }\n\n _updateItemQuantity(event) {\n event.preventDefault();\n let quantityInput;\n let quantity;\n let lineItemKey;\n\n if (event.currentTarget.hasAttribute('data-remove-item')) {\n quantity = 0;\n lineItemKey = event.currentTarget.dataset.removeItem;\n } else {\n quantityInput = event.currentTarget;\n quantity = quantityInput.value;\n\n if (quantity === '') {\n return;\n }\n\n lineItemKey = quantityInput.dataset.quantityKey;\n } // cancel any pending requests\n\n\n if (this.updateTimeout !== null) {\n clearTimeout(this.updateTimeout);\n }\n\n this.updateTimeout = setTimeout(() => {\n // Debounce to avoid firing requests while user is still entering number\n const thisTimeoutId = this.updateTimeout;\n const request = new XMLHttpRequest();\n request.open('POST', `${window.Theme.routes.cart_change_url}.js`, true);\n request.setRequestHeader('Content-Type', 'application/json');\n request.responseType = 'json';\n\n request.onload = () => {\n const cart = request.response; // If another request is in progress, discard this update\n\n if (this.updateTimeout && this.updateTimeout !== thisTimeoutId) {\n return;\n }\n\n if (cart.item_count === 0) {\n // reload to show empty cart state\n window.location.reload();\n return;\n }\n\n this.updateCart(cart, thisTimeoutId);\n };\n\n request.send(JSON.stringify({\n quantity,\n id: lineItemKey\n }));\n }, 300);\n }\n\n updateCart(cart, timeoutId) {\n const cartCounts = document.querySelectorAll('.cart-count-number');\n cartCounts.forEach(el => {\n el.innerText = cart.item_count;\n }); // Swap the cart contents to update discount labels.\n\n _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_0__.default.load(window.Theme.routes.cart_url, {\n view: 'ajax'\n }).then(({\n data,\n html\n }) => {\n // If another request is in progress, discard this update\n if (this.updateTimeout !== timeoutId) {\n return;\n }\n\n this._unbindCartItemEvents(); // Inject new cart table contents\n\n\n const newTableContainer = document.createElement('div');\n newTableContainer.innerHTML = html.table;\n (0,morphdom__WEBPACK_IMPORTED_MODULE_1__.default)(this.cartTable, newTableContainer.querySelector('table'), {\n onBeforeElUpdated: (fromEl, toEl) => {\n // Skip images if src matches\n // - we don't want to reload lazy loaded images\n if (fromEl.tagName === 'IMG' && fromEl.src === toEl.src) {\n return false;\n }\n\n return true;\n }\n });\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(this.cartTable); // Inject new cart level discounts\n\n const newDiscountContainer = document.createElement('div');\n newDiscountContainer.innerHTML = html.discounts;\n this.cartDiscountContainer.innerHTML = newDiscountContainer.querySelector('[data-cart-discount-container]').innerHTML; // Update total\n\n this.totalPrice.innerHTML = data.totalPrice;\n\n this._bindCartItemEvents();\n }).catch(() => window.location.reload());\n }\n\n saveSpecialInstructions() {\n const newNote = this.cartInstructionsTextarea.value;\n const request = new XMLHttpRequest();\n request.open('POST', `/cart/update.js?note=${encodeURI(newNote)}`);\n request.responseType = 'json';\n request.send();\n }\n\n _calculateShipping(customerAddress) {\n let shippingAddress = {};\n\n if (customerAddress) {\n shippingAddress = customerAddress;\n } else {\n const addressCountry = document.querySelector('#address_country');\n const addressProvince = document.querySelector('#address_province');\n const addressZip = document.querySelector('#address_zip');\n shippingAddress.country = addressCountry ? addressCountry.value : '';\n shippingAddress.province = addressProvince ? addressProvince.value : '';\n shippingAddress.zip = addressZip ? addressZip.value : '';\n }\n\n const queryString = Object.keys(shippingAddress).map(key => `${encodeURIComponent(`shipping_address[${key}]`)}=${encodeURIComponent(shippingAddress[key])}`).join('&');\n const request = new XMLHttpRequest();\n request.open('GET', `/cart/shipping_rates.json?${queryString}`);\n request.responseType = 'json';\n\n request.onload = () => {\n const {\n status,\n response\n } = request;\n\n if (status === 422) {\n this._handleErrors(response);\n\n return;\n }\n\n const rates = response.shipping_rates;\n let address = `${shippingAddress.zip}, ${shippingAddress.province}, ${shippingAddress.country}`;\n\n if (!shippingAddress.province.length) {\n address = `${shippingAddress.zip}, ${shippingAddress.country}`;\n }\n\n if (!shippingAddress.zip.length) {\n address = `${shippingAddress.province}, ${shippingAddress.country}`;\n }\n\n if (!shippingAddress.province.length || !shippingAddress.zip.length) {\n address = shippingAddress.country;\n }\n\n const cartShippingCalculatorResponse = this.el.querySelector('.cart-shipping-calculator-response');\n cartShippingCalculatorResponse.innerHTML = '<p class=\"shipping-calculator-response message\"></p><ul class=\"shipping-rates\"/></ul>';\n const ratesFeedback = this.el.querySelector('.shipping-calculator-response');\n\n if (rates.length > 1) {\n const firstRate = window.Theme.Currency.formatMoney(rates[0].price, window.Theme.moneyFormat);\n const multipleShippingRates = window.Theme.shippingCalcMultiRates.replace('--address--', address).replace('--number_of_rates--', rates.length).replace('--rate--', `<span class='money'>${firstRate}</span>`);\n ratesFeedback.innerHTML = multipleShippingRates;\n } else if (rates.length === 1) {\n const oneShippingRate = window.Theme.shippingCalcOneRate.replace('--address--', address);\n ratesFeedback.innerHTML = oneShippingRate;\n } else {\n ratesFeedback.innerHTML = window.Theme.shippingCalcNoRates;\n }\n\n const cartShippingRates = this.el.querySelector('.shipping-rates');\n\n for (let i = 0; i < rates.length; i++) {\n const rate = rates[i];\n const price = window.Theme.Currency.formatMoney(rate.price, window.Theme.moneyFormat);\n const rateValues = window.Theme.shippingCalcRateValues.replace('--rate_title--', rate.name).replace('--rate--', `<span class='money'>${price}</span>`);\n const rateEl = document.createElement('li');\n rateEl.innerHTML = rateValues;\n cartShippingRates.appendChild(rateEl);\n }\n };\n\n request.send();\n }\n\n _handleErrors(errors) {\n let errorMessage = '';\n\n if ('zip' in errors) {\n errorMessage = window.Theme.shippingCalcErrorMessage.replace('--error_message--', errors.zip);\n } else {\n errorMessage = errors;\n }\n\n document.querySelector('.cart-shipping-calculator-response').innerHTML = `<p>${errorMessage}</p>`;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDYXJ0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0NhcnQuanM/NzU1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCBtb3JwaGRvbSBmcm9tICdtb3JwaGRvbSc7XG5pbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IHsgQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IgfSBmcm9tICdAc2hvcGlmeS90aGVtZS1hZGRyZXNzZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNDYXJ0IHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuY2FydFRhYmxlID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYXJ0LXRhYmxlXScpO1xuICAgIHRoaXMuY2FydERpc2NvdW50Q29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYXJ0LWRpc2NvdW50LWNvbnRhaW5lcl0nKTtcbiAgICB0aGlzLnRvdGFsUHJpY2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvdGFsLXByaWNlXScpO1xuICAgIHRoaXMucXVhbnRpdHlJbnB1dHMgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlSXRlbSA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2xhc3MgPSAnY2FydC1pbml0aWFsaXplZCc7XG4gICAgdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FydC1pbnN0cnVjdGlvbnMgdGV4dGFyZWEnKTtcblxuICAgIGlmICh0aGlzLmNhcnRJbnN0cnVjdGlvbnNUZXh0YXJlYSkge1xuICAgICAgdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5zYXZlU3BlY2lhbEluc3RydWN0aW9ucygpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iaW5kQ2FydEl0ZW1FdmVudHMoKTtcblxuICAgIGNvbnN0IHsgaGFzU2hpcHBpbmdDYWxjdWxhdG9yIH0gPSBzZWN0aW9uLmRhdGE7XG5cbiAgICBpZiAoaGFzU2hpcHBpbmdDYWxjdWxhdG9yKSB7XG4gICAgICBjb25zdCBjb3VudHJ5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZHJlc3NfY291bnRyeScpO1xuICAgICAgY29uc3QgcHJvdmluY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkcmVzc19wcm92aW5jZScpO1xuICAgICAgY29uc3QgcHJvdmluY2VDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkcmVzc19wcm92aW5jZV9jb250YWluZXInKTtcblxuICAgICAgaWYgKCFjb3VudHJ5U2VsZWN0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnNoaXBwaW5nU2VsZWN0cy5mb3JFYWNoKHNlbGVjdCA9PiB7XG4gICAgICAgICAgY29uc3QgeyBwcmV2aW91c0VsZW1lbnRTaWJsaW5nLCBvcHRpb25zLCBzZWxlY3RlZEluZGV4IH0gPSBzZWxlY3Q7XG5cbiAgICAgICAgICBpZiAoIXByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgIW9wdGlvbnMgfHwgIW9wdGlvbnMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICBwcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlubmVyVGV4dCA9IG9wdGlvbnNbc2VsZWN0ZWRJbmRleCA+PSAwID8gc2VsZWN0ZWRJbmRleCA6IDBdLnRleHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2hpcHBpbmdTdWJtaXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3Itc3VibWl0XScpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVTaGlwcGluZyA9ICgpID0+IHRoaXMuX2NhbGN1bGF0ZVNoaXBwaW5nKCk7XG4gICAgICB0aGlzLnNoaXBwaW5nU2VsZWN0cyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmNhcnQtc2hpcHBpbmctY2FsY3VsYXRvciBzZWxlY3QnKTtcbiAgICAgIHRoaXMuc2hpcHBpbmdTZWxlY3RzLmZvckVhY2goc2hpcHBpbmdTZWxlY3QgPT4gb2JzZXJ2ZXIub2JzZXJ2ZShzaGlwcGluZ1NlbGVjdCwgeyBjaGlsZExpc3Q6IHRydWUgfSkpO1xuICAgICAgdGhpcy5zaGlwcGluZ0NvdW50cnlQcm92aW5jZVNlbGVjdG9yID0gbmV3IENvdW50cnlQcm92aW5jZVNlbGVjdG9yKGNvdW50cnlTZWxlY3QuaW5uZXJIVE1MKTtcblxuICAgICAgdGhpcy5zaGlwcGluZ0NvdW50cnlQcm92aW5jZVNlbGVjdG9yXG4gICAgICAgIC5idWlsZChcbiAgICAgICAgICBjb3VudHJ5U2VsZWN0LFxuICAgICAgICAgIHByb3ZpbmNlU2VsZWN0LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ291bnRyeUNoYW5nZTogcHJvdmluY2VzID0+IHtcbiAgICAgICAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcm92aW5jZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm92aW5jZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gXCJQcm92aW5jZVwiLCBcIlN0YXRlXCIsIFwiUmVnaW9uXCIsIGV0Yy4gYW5kIFwiUG9zdGFsIENvZGVcIiwgXCJaSVAgQ29kZVwiLCBldGMuXG4gICAgICAgICAgICAgIC8vIEV2ZW4gY291bnRyaWVzIHdpdGhvdXQgcHJvdmluY2VzIGluY2x1ZGUgYSBsYWJlbC5cbiAgICAgICAgICAgICAgY29uc3QgeyBsYWJlbCwgemlwX2xhYmVsOiB6aXBMYWJlbCB9ID0gd2luZG93LkNvdW50cmllc1tjb3VudHJ5U2VsZWN0LnZhbHVlXTtcbiAgICAgICAgICAgICAgcHJvdmluY2VDb250YWluZXIucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPVwiYWRkcmVzc19wcm92aW5jZVwiXScpLmlubmVySFRNTCA9IGxhYmVsO1xuICAgICAgICAgICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1cImFkZHJlc3NfemlwXCJdJykuaW5uZXJIVE1MID0gemlwTGFiZWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgIHRoaXMuc2hpcHBpbmdTdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNhbGN1bGF0ZVNoaXBwaW5nKTtcblxuICAgICAgaWYgKHdpbmRvdy5UaGVtZS5jdXN0b21lckFkZHJlc3MpIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlU2hpcHBpbmcod2luZG93LlRoZW1lLmN1c3RvbWVyQWRkcmVzcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2JpbmRDYXJ0SXRlbUV2ZW50cygpIHtcbiAgICB0aGlzLnF1YW50aXR5SW5wdXRzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1xdWFudGl0eS1rZXldJyk7XG4gICAgdGhpcy5yZW1vdmVJdGVtID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZW1vdmUtaXRlbV0nKTtcbiAgICB0aGlzLmNhcnRUYWJsZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC10YWJsZV0nKTtcbiAgICB0aGlzLmNhcnREaXNjb3VudENvbnRhaW5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC1kaXNjb3VudC1jb250YWluZXJdJyk7XG4gICAgdGhpcy50b3RhbFByaWNlID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b3RhbC1wcmljZV0nKTtcblxuICAgIHRoaXMucXVhbnRpdHlJbnB1dHMuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGV2ZW50ID0+IHRoaXMuX3VwZGF0ZUl0ZW1RdWFudGl0eShldmVudCkpKTtcbiAgICB0aGlzLnJlbW92ZUl0ZW0uZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuX3VwZGF0ZUl0ZW1RdWFudGl0eShldmVudCkpKTtcbiAgfVxuXG4gIF91bmJpbmRDYXJ0SXRlbUV2ZW50cygpIHtcbiAgICB0aGlzLnF1YW50aXR5SW5wdXRzLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBldmVudCA9PiB0aGlzLl91cGRhdGVJdGVtUXVhbnRpdHkoZXZlbnQpKSk7XG4gICAgdGhpcy5yZW1vdmVJdGVtLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl91cGRhdGVJdGVtUXVhbnRpdHkoZXZlbnQpKSk7XG5cbiAgICB0aGlzLnF1YW50aXR5SW5wdXRzID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZUl0ZW0gPSBudWxsO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMuc2hpcHBpbmdTdWJtaXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNhbGN1bGF0ZVNoaXBwaW5nKTtcblxuICAgIGlmICh0aGlzLmNhcnRJbnN0cnVjdGlvbnNUZXh0YXJlYSkge1xuICAgICAgdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5zYXZlU3BlY2lhbEluc3RydWN0aW9ucygpKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSXRlbVF1YW50aXR5KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGxldCBxdWFudGl0eUlucHV0O1xuICAgIGxldCBxdWFudGl0eTtcbiAgICBsZXQgbGluZUl0ZW1LZXk7XG5cbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVtb3ZlLWl0ZW0nKSkge1xuICAgICAgcXVhbnRpdHkgPSAwO1xuICAgICAgbGluZUl0ZW1LZXkgPSBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQucmVtb3ZlSXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVhbnRpdHlJbnB1dCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICBxdWFudGl0eSA9IHF1YW50aXR5SW5wdXQudmFsdWU7XG5cbiAgICAgIGlmIChxdWFudGl0eSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsaW5lSXRlbUtleSA9IHF1YW50aXR5SW5wdXQuZGF0YXNldC5xdWFudGl0eUtleTtcbiAgICB9XG5cbiAgICAvLyBjYW5jZWwgYW55IHBlbmRpbmcgcmVxdWVzdHNcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIERlYm91bmNlIHRvIGF2b2lkIGZpcmluZyByZXF1ZXN0cyB3aGlsZSB1c2VyIGlzIHN0aWxsIGVudGVyaW5nIG51bWJlclxuXG4gICAgICBjb25zdCB0aGlzVGltZW91dElkID0gdGhpcy51cGRhdGVUaW1lb3V0O1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCBgJHt3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfY2hhbmdlX3VybH0uanNgLCB0cnVlKTtcbiAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhcnQgPSByZXF1ZXN0LnJlc3BvbnNlO1xuXG4gICAgICAgIC8vIElmIGFub3RoZXIgcmVxdWVzdCBpcyBpbiBwcm9ncmVzcywgZGlzY2FyZCB0aGlzIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0ICYmIHRoaXMudXBkYXRlVGltZW91dCAhPT0gdGhpc1RpbWVvdXRJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FydC5pdGVtX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gcmVsb2FkIHRvIHNob3cgZW1wdHkgY2FydCBzdGF0ZVxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0KGNhcnQsIHRoaXNUaW1lb3V0SWQpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Quc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1YW50aXR5LFxuICAgICAgICBpZDogbGluZUl0ZW1LZXksXG4gICAgICB9KSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIHVwZGF0ZUNhcnQoY2FydCwgdGltZW91dElkKSB7XG4gICAgY29uc3QgY2FydENvdW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJ0LWNvdW50LW51bWJlcicpO1xuICAgIGNhcnRDb3VudHMuZm9yRWFjaChlbCA9PiB7IGVsLmlubmVyVGV4dCA9IGNhcnQuaXRlbV9jb3VudDsgfSk7XG5cbiAgICAvLyBTd2FwIHRoZSBjYXJ0IGNvbnRlbnRzIHRvIHVwZGF0ZSBkaXNjb3VudCBsYWJlbHMuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfdXJsLFxuICAgICAgeyB2aWV3OiAnYWpheCcgfSxcbiAgICApXG4gICAgICAudGhlbigoeyBkYXRhLCBodG1sIH0pID0+IHtcbiAgICAgICAgLy8gSWYgYW5vdGhlciByZXF1ZXN0IGlzIGluIHByb2dyZXNzLCBkaXNjYXJkIHRoaXMgdXBkYXRlXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVRpbWVvdXQgIT09IHRpbWVvdXRJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VuYmluZENhcnRJdGVtRXZlbnRzKCk7XG5cbiAgICAgICAgLy8gSW5qZWN0IG5ldyBjYXJ0IHRhYmxlIGNvbnRlbnRzXG4gICAgICAgIGNvbnN0IG5ld1RhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5ld1RhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwudGFibGU7XG5cbiAgICAgICAgbW9ycGhkb20oXG4gICAgICAgICAgdGhpcy5jYXJ0VGFibGUsXG4gICAgICAgICAgbmV3VGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcigndGFibGUnKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkJlZm9yZUVsVXBkYXRlZDogKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgICAgICAgICAvLyBTa2lwIGltYWdlcyBpZiBzcmMgbWF0Y2hlc1xuICAgICAgICAgICAgICAvLyAtIHdlIGRvbid0IHdhbnQgdG8gcmVsb2FkIGxhenkgbG9hZGVkIGltYWdlc1xuICAgICAgICAgICAgICBpZiAoZnJvbUVsLnRhZ05hbWUgPT09ICdJTUcnICYmIGZyb21FbC5zcmMgPT09IHRvRWwuc3JjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJpbWcud2F0Y2godGhpcy5jYXJ0VGFibGUpO1xuXG4gICAgICAgIC8vIEluamVjdCBuZXcgY2FydCBsZXZlbCBkaXNjb3VudHNcbiAgICAgICAgY29uc3QgbmV3RGlzY291bnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbmV3RGlzY291bnRDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbC5kaXNjb3VudHM7XG4gICAgICAgIHRoaXMuY2FydERpc2NvdW50Q29udGFpbmVyLmlubmVySFRNTCA9IG5ld0Rpc2NvdW50Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcnQtZGlzY291bnQtY29udGFpbmVyXScpLmlubmVySFRNTDtcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxcbiAgICAgICAgdGhpcy50b3RhbFByaWNlLmlubmVySFRNTCA9IGRhdGEudG90YWxQcmljZTtcbiAgICAgICAgdGhpcy5fYmluZENhcnRJdGVtRXZlbnRzKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XG4gIH1cblxuICBzYXZlU3BlY2lhbEluc3RydWN0aW9ucygpIHtcbiAgICBjb25zdCBuZXdOb3RlID0gdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEudmFsdWU7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKCdQT1NUJywgYC9jYXJ0L3VwZGF0ZS5qcz9ub3RlPSR7ZW5jb2RlVVJJKG5ld05vdGUpfWApO1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgIHJlcXVlc3Quc2VuZCgpO1xuICB9XG5cbiAgX2NhbGN1bGF0ZVNoaXBwaW5nKGN1c3RvbWVyQWRkcmVzcykge1xuICAgIGxldCBzaGlwcGluZ0FkZHJlc3MgPSB7fTtcblxuICAgIGlmIChjdXN0b21lckFkZHJlc3MpIHtcbiAgICAgIHNoaXBwaW5nQWRkcmVzcyA9IGN1c3RvbWVyQWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWRkcmVzc0NvdW50cnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkcmVzc19jb3VudHJ5Jyk7XG4gICAgICBjb25zdCBhZGRyZXNzUHJvdmluY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkcmVzc19wcm92aW5jZScpO1xuICAgICAgY29uc3QgYWRkcmVzc1ppcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhZGRyZXNzX3ppcCcpO1xuICAgICAgc2hpcHBpbmdBZGRyZXNzLmNvdW50cnkgPSBhZGRyZXNzQ291bnRyeSA/IGFkZHJlc3NDb3VudHJ5LnZhbHVlIDogJyc7XG4gICAgICBzaGlwcGluZ0FkZHJlc3MucHJvdmluY2UgPSBhZGRyZXNzUHJvdmluY2UgPyBhZGRyZXNzUHJvdmluY2UudmFsdWUgOiAnJztcbiAgICAgIHNoaXBwaW5nQWRkcmVzcy56aXAgPSBhZGRyZXNzWmlwID8gYWRkcmVzc1ppcC52YWx1ZSA6ICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMoc2hpcHBpbmdBZGRyZXNzKVxuICAgICAgLm1hcChrZXkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGBzaGlwcGluZ19hZGRyZXNzWyR7a2V5fV1gKX09JHtlbmNvZGVVUklDb21wb25lbnQoc2hpcHBpbmdBZGRyZXNzW2tleV0pfWApXG4gICAgICAuam9pbignJicpO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBgL2NhcnQvc2hpcHBpbmdfcmF0ZXMuanNvbj8ke3F1ZXJ5U3RyaW5nfWApO1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgIHJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBzdGF0dXMsIHJlc3BvbnNlIH0gPSByZXF1ZXN0O1xuXG4gICAgICBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JzKHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXRlcyA9IHJlc3BvbnNlLnNoaXBwaW5nX3JhdGVzO1xuXG4gICAgICBsZXQgYWRkcmVzcyA9IGAke3NoaXBwaW5nQWRkcmVzcy56aXB9LCAke3NoaXBwaW5nQWRkcmVzcy5wcm92aW5jZX0sICR7c2hpcHBpbmdBZGRyZXNzLmNvdW50cnl9YDtcbiAgICAgIGlmICghc2hpcHBpbmdBZGRyZXNzLnByb3ZpbmNlLmxlbmd0aCkge1xuICAgICAgICBhZGRyZXNzID0gYCR7c2hpcHBpbmdBZGRyZXNzLnppcH0sICR7c2hpcHBpbmdBZGRyZXNzLmNvdW50cnl9YDtcbiAgICAgIH1cbiAgICAgIGlmICghc2hpcHBpbmdBZGRyZXNzLnppcC5sZW5ndGgpIHtcbiAgICAgICAgYWRkcmVzcyA9IGAke3NoaXBwaW5nQWRkcmVzcy5wcm92aW5jZX0sICR7c2hpcHBpbmdBZGRyZXNzLmNvdW50cnl9YDtcbiAgICAgIH1cbiAgICAgIGlmICghc2hpcHBpbmdBZGRyZXNzLnByb3ZpbmNlLmxlbmd0aCB8fCAhc2hpcHBpbmdBZGRyZXNzLnppcC5sZW5ndGgpIHtcbiAgICAgICAgYWRkcmVzcyA9IHNoaXBwaW5nQWRkcmVzcy5jb3VudHJ5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXJ0U2hpcHBpbmdDYWxjdWxhdG9yUmVzcG9uc2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jYXJ0LXNoaXBwaW5nLWNhbGN1bGF0b3ItcmVzcG9uc2UnKTtcblxuICAgICAgY2FydFNoaXBwaW5nQ2FsY3VsYXRvclJlc3BvbnNlLmlubmVySFRNTCA9ICc8cCBjbGFzcz1cInNoaXBwaW5nLWNhbGN1bGF0b3ItcmVzcG9uc2UgbWVzc2FnZVwiPjwvcD48dWwgY2xhc3M9XCJzaGlwcGluZy1yYXRlc1wiLz48L3VsPic7XG5cbiAgICAgIGNvbnN0IHJhdGVzRmVlZGJhY2sgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5zaGlwcGluZy1jYWxjdWxhdG9yLXJlc3BvbnNlJyk7XG5cbiAgICAgIGlmIChyYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0UmF0ZSA9IHdpbmRvdy5UaGVtZS5DdXJyZW5jeS5mb3JtYXRNb25leShyYXRlc1swXS5wcmljZSwgd2luZG93LlRoZW1lLm1vbmV5Rm9ybWF0KTtcbiAgICAgICAgY29uc3QgbXVsdGlwbGVTaGlwcGluZ1JhdGVzID0gd2luZG93LlRoZW1lLnNoaXBwaW5nQ2FsY011bHRpUmF0ZXNcbiAgICAgICAgICAucmVwbGFjZSgnLS1hZGRyZXNzLS0nLCBhZGRyZXNzKVxuICAgICAgICAgIC5yZXBsYWNlKCctLW51bWJlcl9vZl9yYXRlcy0tJywgcmF0ZXMubGVuZ3RoKVxuICAgICAgICAgIC5yZXBsYWNlKCctLXJhdGUtLScsIGA8c3BhbiBjbGFzcz0nbW9uZXknPiR7Zmlyc3RSYXRlfTwvc3Bhbj5gKTtcbiAgICAgICAgcmF0ZXNGZWVkYmFjay5pbm5lckhUTUwgPSBtdWx0aXBsZVNoaXBwaW5nUmF0ZXM7XG4gICAgICB9IGVsc2UgaWYgKHJhdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBvbmVTaGlwcGluZ1JhdGUgPSB3aW5kb3cuVGhlbWUuc2hpcHBpbmdDYWxjT25lUmF0ZVxuICAgICAgICAgIC5yZXBsYWNlKCctLWFkZHJlc3MtLScsIGFkZHJlc3MpO1xuICAgICAgICByYXRlc0ZlZWRiYWNrLmlubmVySFRNTCA9IG9uZVNoaXBwaW5nUmF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhdGVzRmVlZGJhY2suaW5uZXJIVE1MID0gd2luZG93LlRoZW1lLnNoaXBwaW5nQ2FsY05vUmF0ZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhcnRTaGlwcGluZ1JhdGVzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuc2hpcHBpbmctcmF0ZXMnKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByYXRlID0gcmF0ZXNbaV07XG4gICAgICAgIGNvbnN0IHByaWNlID0gd2luZG93LlRoZW1lLkN1cnJlbmN5LmZvcm1hdE1vbmV5KHJhdGUucHJpY2UsIHdpbmRvdy5UaGVtZS5tb25leUZvcm1hdCk7XG4gICAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSB3aW5kb3cuVGhlbWUuc2hpcHBpbmdDYWxjUmF0ZVZhbHVlc1xuICAgICAgICAgIC5yZXBsYWNlKCctLXJhdGVfdGl0bGUtLScsIHJhdGUubmFtZSlcbiAgICAgICAgICAucmVwbGFjZSgnLS1yYXRlLS0nLCBgPHNwYW4gY2xhc3M9J21vbmV5Jz4ke3ByaWNlfTwvc3Bhbj5gKTtcbiAgICAgICAgY29uc3QgcmF0ZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICByYXRlRWwuaW5uZXJIVE1MID0gcmF0ZVZhbHVlcztcblxuICAgICAgICBjYXJ0U2hpcHBpbmdSYXRlcy5hcHBlbmRDaGlsZChyYXRlRWwpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVxdWVzdC5zZW5kKCk7XG4gIH1cblxuICBfaGFuZGxlRXJyb3JzKGVycm9ycykge1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIGlmICgnemlwJyBpbiBlcnJvcnMpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IHdpbmRvdy5UaGVtZS5zaGlwcGluZ0NhbGNFcnJvck1lc3NhZ2UucmVwbGFjZSgnLS1lcnJvcl9tZXNzYWdlLS0nLCBlcnJvcnMuemlwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgIH1cblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYXJ0LXNoaXBwaW5nLWNhbGN1bGF0b3ItcmVzcG9uc2UnKS5pbm5lckhUTUwgPSBgPHA+JHtlcnJvck1lc3NhZ2V9PC9wPmA7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFSQTtBQVlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5UQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticCart.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticCollection.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/sections/StaticCollection.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticCollection)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n/* harmony import */ var _components_Select__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/Select */ \"./source/scripts/components/Select.js\");\n/* harmony import */ var _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/FacetedFilters */ \"./source/scripts/components/FacetedFilters.js\");\n\n\n\n\nclass StaticCollection {\n constructor(section) {\n this.el = section.el;\n this.collectionSortingEl = this.el.querySelector('[data-collection-sorting]');\n this.masonry = this.el.querySelector('[data-masonry-grid]');\n this.masonryGrid = null;\n this.productListItems = [];\n this.el.querySelectorAll('.product-list-item').forEach(product => this.productListItems.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_1__.default({\n el: product\n })));\n\n if (this.collectionSortingEl) {\n this.collectionSortingEl.addEventListener('change', event => this.sortCollection(event));\n new _components_Select__WEBPACK_IMPORTED_MODULE_2__.default({\n el: this.collectionSortingEl\n });\n }\n\n if (this.masonry) {\n this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n el: this.masonry,\n settings: {\n itemSelector: '.product-list-item',\n horizontalOrder: true\n }\n });\n }\n\n this.facetedFilters = new _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_3__.default(section);\n }\n\n remove() {\n if (this.masonryGrid) {\n this.masonryGrid.unload();\n }\n\n this.productListItems.forEach(item => item.remove());\n\n if (this.collectionSortingEl) {\n this.collectionSortingEl.removeEventListener('change', event => this.sortCollection(event));\n }\n }\n\n sortCollection(event) {\n const {\n currentTarget\n } = event;\n let search;\n const Sorting = {};\n Sorting.sort_by = currentTarget.value;\n const currentVendorSelected = currentTarget.closest('.select-wrapper').classList.contains('vendor-collection');\n const facetedFiltersEnabled = document.querySelector('[data-faceted-filter]');\n\n if (currentVendorSelected || facetedFiltersEnabled) {\n const currentSearch = location.search;\n const searchParts = currentSearch.split('&');\n\n for (let index = 0; index < searchParts.length; index++) {\n const part = searchParts[index];\n\n if (part.indexOf('sort_by') !== -1) {\n searchParts.splice(index, 1);\n }\n }\n\n search = searchParts.join('&');\n location.search = `${search}&${Object.keys(Sorting).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(Sorting[k])}`).join('&')}`;\n } else {\n location.search = Object.keys(Sorting).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(Sorting[k])}`).join('&');\n }\n }\n\n onSectionUnload() {\n this.remove();\n this.facetedFilters.unload();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0NvbGxlY3Rpb24uanM/ZjMzZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWFzb25yeUdyaWQgZnJvbSAnLi4vY29tcG9uZW50cy9NYXNvbnJ5R3JpZCc7XG5pbXBvcnQgUHJvZHVjdExpc3RJdGVtIGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdExpc3RJdGVtJztcbmltcG9ydCBTZWxlY3QgZnJvbSAnLi4vY29tcG9uZW50cy9TZWxlY3QnO1xuaW1wb3J0IEZhY2V0ZWRGaWx0ZXJzIGZyb20gJy4uL2NvbXBvbmVudHMvRmFjZXRlZEZpbHRlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuY29sbGVjdGlvblNvcnRpbmdFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbi1zb3J0aW5nXScpO1xuICAgIHRoaXMubWFzb25yeSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS1ncmlkXScpO1xuICAgIHRoaXMubWFzb25yeUdyaWQgPSBudWxsO1xuXG4gICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zID0gW107XG4gICAgdGhpcy5lbFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LWxpc3QtaXRlbScpXG4gICAgICAuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMucHJvZHVjdExpc3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdCB9KSkpO1xuXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNvcnRpbmdFbCkge1xuICAgICAgdGhpcy5jb2xsZWN0aW9uU29ydGluZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuc29ydENvbGxlY3Rpb24oZXZlbnQpKTtcbiAgICAgIG5ldyBTZWxlY3QoeyBlbDogdGhpcy5jb2xsZWN0aW9uU29ydGluZ0VsIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hc29ucnkpIHtcbiAgICAgIHRoaXMubWFzb25yeUdyaWQgPSBuZXcgTWFzb25yeUdyaWQoe1xuICAgICAgICBlbDogdGhpcy5tYXNvbnJ5LFxuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIGl0ZW1TZWxlY3RvcjogJy5wcm9kdWN0LWxpc3QtaXRlbScsXG4gICAgICAgICAgaG9yaXpvbnRhbE9yZGVyOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5mYWNldGVkRmlsdGVycyA9IG5ldyBGYWNldGVkRmlsdGVycyhzZWN0aW9uKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5tYXNvbnJ5R3JpZCkge1xuICAgICAgdGhpcy5tYXNvbnJ5R3JpZC51bmxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RMaXN0SXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0ucmVtb3ZlKCkpO1xuXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNvcnRpbmdFbCkge1xuICAgICAgdGhpcy5jb2xsZWN0aW9uU29ydGluZ0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuc29ydENvbGxlY3Rpb24oZXZlbnQpKTtcbiAgICB9XG4gIH1cblxuICBzb3J0Q29sbGVjdGlvbihldmVudCkge1xuICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG4gICAgbGV0IHNlYXJjaDtcblxuICAgIGNvbnN0IFNvcnRpbmcgPSB7fTtcbiAgICBTb3J0aW5nLnNvcnRfYnkgPSBjdXJyZW50VGFyZ2V0LnZhbHVlO1xuXG4gICAgY29uc3QgY3VycmVudFZlbmRvclNlbGVjdGVkID0gY3VycmVudFRhcmdldC5jbG9zZXN0KCcuc2VsZWN0LXdyYXBwZXInKS5jbGFzc0xpc3QuY29udGFpbnMoJ3ZlbmRvci1jb2xsZWN0aW9uJyk7XG4gICAgY29uc3QgZmFjZXRlZEZpbHRlcnNFbmFibGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZmFjZXRlZC1maWx0ZXJdJyk7XG5cbiAgICBpZiAoY3VycmVudFZlbmRvclNlbGVjdGVkIHx8IGZhY2V0ZWRGaWx0ZXJzRW5hYmxlZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICAgIGNvbnN0IHNlYXJjaFBhcnRzID0gY3VycmVudFNlYXJjaC5zcGxpdCgnJicpO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2VhcmNoUGFydHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBzZWFyY2hQYXJ0c1tpbmRleF07XG4gICAgICAgIGlmIChwYXJ0LmluZGV4T2YoJ3NvcnRfYnknKSAhPT0gLTEpIHtcbiAgICAgICAgICBzZWFyY2hQYXJ0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlYXJjaCA9IHNlYXJjaFBhcnRzLmpvaW4oJyYnKTtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaCA9IGAke3NlYXJjaH0mJHtPYmplY3Qua2V5cyhTb3J0aW5nKS5tYXAoayA9PiAoXG4gICAgICAgIGAke2VuY29kZVVSSUNvbXBvbmVudChrKX09JHtlbmNvZGVVUklDb21wb25lbnQoU29ydGluZ1trXSl9YFxuICAgICAgKSkuam9pbignJicpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaCA9IE9iamVjdC5rZXlzKFNvcnRpbmcpLm1hcChrID0+IChcbiAgICAgICAgYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGspfT0ke2VuY29kZVVSSUNvbXBvbmVudChTb3J0aW5nW2tdKX1gXG4gICAgICApKS5qb2luKCcmJyk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgdGhpcy5mYWNldGVkRmlsdGVycy51bmxvYWQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFGQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticCollection.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticCollectionsList.js":
+/*!**********************************************************!*\
+ !*** ./source/scripts/sections/StaticCollectionsList.js ***!
+ \**********************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticCollectionsList)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n\nclass StaticCollectionsList {\n constructor(section) {\n this.el = section.el;\n this.masonry = this.el.querySelector('[data-masonry-grid]');\n this.masonryGrid = null;\n\n if (this.masonry) {\n this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n el: this.masonry\n });\n }\n }\n\n onSectionUnload() {\n if (this.masonryGrid) {\n this.masonryGrid.unload();\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uc0xpc3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljQ29sbGVjdGlvbnNMaXN0LmpzP2FmOTgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hc29ucnlHcmlkIGZyb20gJy4uL2NvbXBvbmVudHMvTWFzb25yeUdyaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uc0xpc3Qge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5tYXNvbnJ5ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tYXNvbnJ5LWdyaWRdJyk7XG4gICAgdGhpcy5tYXNvbnJ5R3JpZCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5tYXNvbnJ5KSB7XG4gICAgICB0aGlzLm1hc29ucnlHcmlkID0gbmV3IE1hc29ucnlHcmlkKHsgZWw6IHRoaXMubWFzb25yeSB9KTtcbiAgICB9XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgaWYgKHRoaXMubWFzb25yeUdyaWQpIHtcbiAgICAgIHRoaXMubWFzb25yeUdyaWQudW5sb2FkKCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticCollectionsList.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticFooter.js":
+/*!*************************************************!*\
+ !*** ./source/scripts/sections/StaticFooter.js ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticFooter)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_shopify_cross_border__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-cross-border */ \"./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js\");\n\n\nclass StaticFooter {\n constructor(section) {\n this.el = section.el;\n this.mailingListEl = this.el.querySelector('.mailing-list');\n this.upperFooterEl = this.el.querySelector('.upper-footer');\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n const countryDisclosureEls = section.el.querySelectorAll('[data-disclosure-country]');\n const localeDisclosureEls = section.el.querySelectorAll('[data-disclosure-locale]');\n this.disclosures = [];\n\n if (countryDisclosureEls.length > 0) {\n countryDisclosureEls.forEach(disclosureEl => {\n this.disclosures.push(new _pixelunion_shopify_cross_border__WEBPACK_IMPORTED_MODULE_1__.default(disclosureEl));\n });\n }\n\n if (localeDisclosureEls.length > 0) {\n localeDisclosureEls.forEach(disclosureEl => {\n this.disclosures.push(new _pixelunion_shopify_cross_border__WEBPACK_IMPORTED_MODULE_1__.default(disclosureEl));\n });\n }\n\n this.events.register(window, 'resize', () => {\n // If the resize was triggered by an Android device's keyboard opening, return\n if (document.activeElement.getAttribute('type') === 'email') return;\n if (!this.mailingListEl) return;\n\n if (window.innerWidth <= 1080 && window.innerWidth !== this.width) {\n this.upperFooterEl.insertBefore(this.mailingListEl, this.upperFooterEl.firstChild);\n } else if (window.innerWidth !== this.width) {\n this.upperFooterEl.appendChild(this.mailingListEl);\n }\n });\n }\n\n onSectionUnload() {\n this.events.unregisterAll();\n this.disclosures.forEach(disclosure => disclosure.unload());\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNGb290ZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljRm9vdGVyLmpzP2YxYjQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50cyBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IERpc2Nsb3N1cmUgZnJvbSAnQHBpeGVsdW5pb24vc2hvcGlmeS1jcm9zcy1ib3JkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNGb290ZXIge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5tYWlsaW5nTGlzdEVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcubWFpbGluZy1saXN0Jyk7XG4gICAgdGhpcy51cHBlckZvb3RlckVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcudXBwZXItZm9vdGVyJyk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG5cbiAgICBjb25zdCBjb3VudHJ5RGlzY2xvc3VyZUVscyA9IHNlY3Rpb24uZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGlzY2xvc3VyZS1jb3VudHJ5XScpO1xuICAgIGNvbnN0IGxvY2FsZURpc2Nsb3N1cmVFbHMgPSBzZWN0aW9uLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRpc2Nsb3N1cmUtbG9jYWxlXScpO1xuICAgIHRoaXMuZGlzY2xvc3VyZXMgPSBbXTtcblxuICAgIGlmIChjb3VudHJ5RGlzY2xvc3VyZUVscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb3VudHJ5RGlzY2xvc3VyZUVscy5mb3JFYWNoKGRpc2Nsb3N1cmVFbCA9PiB7XG4gICAgICAgIHRoaXMuZGlzY2xvc3VyZXMucHVzaChuZXcgRGlzY2xvc3VyZShkaXNjbG9zdXJlRWwpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsb2NhbGVEaXNjbG9zdXJlRWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvY2FsZURpc2Nsb3N1cmVFbHMuZm9yRWFjaChkaXNjbG9zdXJlRWwgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nsb3N1cmVzLnB1c2gobmV3IERpc2Nsb3N1cmUoZGlzY2xvc3VyZUVsKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgcmVzaXplIHdhcyB0cmlnZ2VyZWQgYnkgYW4gQW5kcm9pZCBkZXZpY2UncyBrZXlib2FyZCBvcGVuaW5nLCByZXR1cm5cbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAnZW1haWwnKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMubWFpbGluZ0xpc3RFbCkgcmV0dXJuO1xuXG4gICAgICBpZiAoKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApICYmICh3aW5kb3cuaW5uZXJXaWR0aCAhPT0gdGhpcy53aWR0aCkpIHtcbiAgICAgICAgdGhpcy51cHBlckZvb3RlckVsLmluc2VydEJlZm9yZSh0aGlzLm1haWxpbmdMaXN0RWwsIHRoaXMudXBwZXJGb290ZXJFbC5maXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggIT09IHRoaXMud2lkdGgpIHtcbiAgICAgICAgdGhpcy51cHBlckZvb3RlckVsLmFwcGVuZENoaWxkKHRoaXMubWFpbGluZ0xpc3RFbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgdGhpcy5kaXNjbG9zdXJlcy5mb3JFYWNoKGRpc2Nsb3N1cmUgPT4gZGlzY2xvc3VyZS51bmxvYWQoKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBekNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticFooter.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticHeader.js":
+/*!*************************************************!*\
+ !*** ./source/scripts/sections/StaticHeader.js ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticHeader)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _StaticNavigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./StaticNavigation */ \"./source/scripts/sections/StaticNavigation.js\");\n/* harmony import */ var _components_PredictiveSearch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/PredictiveSearch */ \"./source/scripts/components/PredictiveSearch.js\");\n/* harmony import */ var _components_SearchTakeover__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/SearchTakeover */ \"./source/scripts/components/SearchTakeover.js\");\n\n\n\n\n\nclass StaticHeader extends _StaticNavigation__WEBPACK_IMPORTED_MODULE_2__.default {\n constructor(section) {\n super(section);\n this.el = section.el;\n this.headerEvents = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.mainHeader = this.el.querySelector('[data-header-main]');\n this.headerContent = this.el.querySelector('[data-header-content]');\n this.navigationWrapper = this.el.querySelector('[data-navigation-wrapper]');\n if (!this.navigationWrapper) return;\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n this.navigationContent = this.el.querySelector('.navigation-mobile[data-navigation-content]');\n } else {\n this.navigationContent = this.el.querySelector('.navigation-desktop[data-navigation-content]');\n }\n\n this.branding = this.el.querySelector('[data-header-branding]');\n this.headerTools = this.el.querySelector('.header-tools');\n this.headerRight = this.el.querySelector('[data-header-content-right]');\n this.cachedHeight = 0;\n this.cachedStickyHeight = 0;\n this.isCacheStale = true;\n this.search = this.el.querySelector('[data-header-search-toggle]');\n this.searchTakeoverEl = this.el.querySelector('[data-search-takeover]');\n this.searchTakeover = new _components_SearchTakeover__WEBPACK_IMPORTED_MODULE_4__.default(this.searchTakeoverEl);\n this.headerEvents.register(this.search, 'click', () => this.searchTakeover.open());\n this.enablePredictiveSearch = section.data.enable_predictive_search;\n this.headerSearchForms = this.el.querySelectorAll('[data-search-form]');\n\n if (this.enablePredictiveSearch === 'true') {\n this.headerSearchForms.forEach(el => new _components_PredictiveSearch__WEBPACK_IMPORTED_MODULE_3__.default({\n el\n }));\n }\n\n this.isStickyHeader = section.data.stickyHeader;\n this.isCompactCenter = section.data.compactCenter === 'compact-center';\n this.navHeight = 0;\n this.windowWidth = _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.windowWidth();\n setTimeout(() => {\n this.navHeight = this.navigationWrapper.getBoundingClientRect().height;\n }, 100);\n\n this._setupBranding();\n\n this._setCompactCenterHeights();\n\n this._toggleStickyHeader(this._shouldHeaderStick());\n\n this._bindEvents();\n\n this.reloadNavigation();\n }\n\n onSectionUnload() {\n super.onSectionUnload();\n window.removeEventListener('resize', this.resizeHeader);\n window.removeEventListener('scroll', this.scrollHeader);\n\n this._toggleStickyHeader(this._shouldHeaderStick());\n }\n\n _bindEvents() {\n this.resizeHeader = () => {\n // Prevent resize caused by iOS viewport change\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.windowWidth() === this.windowWidth) {\n return;\n }\n\n this.windowWidth = _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.windowWidth();\n this.navHeight = this.navigationWrapper.getBoundingClientRect().height;\n this.isCacheStale = true;\n\n this._toggleStickyHeader(this._shouldHeaderStick());\n\n this._setCompactCenterHeights();\n };\n\n this.scrollHeader = () => {\n // Only calculate heights on scroll if sticky header is disabled\n if (!this.isStickyHeader) {\n this._setCompactCenterHeights();\n } // Sticky header calculates heights\n\n\n this._toggleStickyHeader(this._shouldHeaderStick());\n };\n\n window.addEventListener('resize', this.resizeHeader);\n window.addEventListener('scroll', this.scrollHeader);\n }\n\n _shouldHeaderStick() {\n let shouldStick = false;\n\n if (!this.isStickyHeader) {\n return shouldStick;\n }\n\n if (this.isCacheStale) {\n let height = document.body.classList.contains('sticky-header') ? 0 : this.headerContent.getBoundingClientRect().height;\n let stickyHeight = document.body.classList.contains('sticky-header') ? this.headerContent.getBoundingClientRect().height : 0;\n document.body.classList.toggle('sticky-header');\n height = !document.body.classList.contains('sticky-header') ? this.headerContent.getBoundingClientRect().height : height;\n stickyHeight = !document.body.classList.contains('sticky-header') ? stickyHeight : this.headerContent.getBoundingClientRect().height;\n document.body.classList.toggle('sticky-header');\n this.cachedHeight = height;\n this.cachedStickyHeight = stickyHeight;\n this.isCacheStale = false;\n }\n\n if (window.scrollY > this.headerTools.getBoundingClientRect().height + this.cachedHeight - this.cachedStickyHeight) {\n shouldStick = true;\n }\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n shouldStick = false;\n }\n\n return shouldStick;\n }\n\n _toggleStickyHeader(toggleOn) {\n let paddingBottom;\n\n if (toggleOn == null) {\n toggleOn = false;\n }\n\n if (toggleOn && !document.body.classList.contains('sticky-header')) {\n paddingBottom = this.cachedHeight;\n this.mainHeader.style.paddingBottom = `${paddingBottom}px`;\n }\n\n if (!toggleOn) {\n paddingBottom = 0;\n this.mainHeader.style.paddingBottom = `${paddingBottom}px`;\n }\n\n if (toggleOn !== document.body.classList.contains('sticky-header')) {\n if (toggleOn) {\n document.body.classList.add('sticky-header');\n } else {\n document.body.classList.remove('sticky-header');\n }\n\n this._setCompactCenterHeights(!toggleOn);\n }\n }\n /*\n Match Navigation and Branding heights\n Center navigation vertically if Branding is taller\n */\n\n\n _setCompactCenterHeights(toggleOn) {\n if (toggleOn == null) {\n toggleOn = true;\n }\n\n if (!this.isCompactCenter) {\n return;\n }\n\n let minHeight = 'auto'; // Get height of inner navigation to prevent height locking on two row navigation\n\n const navHeight = this.navigationContent.getBoundingClientRect().height;\n let navOffset = 'auto';\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge() && toggleOn) {\n const logoImg = this.branding.querySelector('img');\n\n if (logoImg && !logoImg.complete) {\n this.headerEvents.register(logoImg, 'load', () => this._setCompactCenterHeights());\n }\n\n const heights = [];\n heights.push(navHeight);\n heights.push(this.branding.getBoundingClientRect().height);\n minHeight = Math.max.apply(null, heights);\n }\n\n if (navHeight < minHeight) {\n navOffset = (minHeight - navHeight) / 2;\n }\n\n this.navHeight = this.navigationWrapper.getBoundingClientRect().height;\n\n if (this.isStickyHeader && document.body.classList.contains('sticky-header')) {\n this.headerContent.style.minHeight = 'auto';\n this.navigationWrapper.style.marginTop = 0;\n } else {\n this.headerContent.style.minHeight = `${minHeight}px`;\n this.navigationWrapper.style.marginTop = `${navOffset}px`;\n }\n }\n\n _setupBranding() {\n // Clone desktop branding to mobile\n const mobileBranding = this.branding.cloneNode(true);\n mobileBranding.removeAttribute('data-header-branding');\n mobileBranding.classList.remove('header-branding-desktop');\n mobileBranding.classList.add('header-branding-mobile');\n this.navigationContent.insertBefore(mobileBranding, this.navigationContent.firstChild);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNIZWFkZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljSGVhZGVyLmpzPzYxZWIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5pbXBvcnQgU3RhdGljTmF2aWdhdGlvbiBmcm9tICcuL1N0YXRpY05hdmlnYXRpb24nO1xuaW1wb3J0IFByZWRpY3RpdmVTZWFyY2ggZnJvbSAnLi4vY29tcG9uZW50cy9QcmVkaWN0aXZlU2VhcmNoJztcbmltcG9ydCBTZWFyY2hUYWtlb3ZlciBmcm9tICcuLi9jb21wb25lbnRzL1NlYXJjaFRha2VvdmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljSGVhZGVyIGV4dGVuZHMgU3RhdGljTmF2aWdhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICBzdXBlcihzZWN0aW9uKTtcblxuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuXG4gICAgdGhpcy5oZWFkZXJFdmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cbiAgICB0aGlzLm1haW5IZWFkZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhlYWRlci1tYWluXScpO1xuICAgIHRoaXMuaGVhZGVyQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGVhZGVyLWNvbnRlbnRdJyk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uV3JhcHBlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbmF2aWdhdGlvbi13cmFwcGVyXScpO1xuXG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb25XcmFwcGVyKSByZXR1cm47XG5cbiAgICBpZiAodGhlbWVVdGlscy5pc0xlc3NUaGFuTGFyZ2UoKSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tbW9iaWxlW2RhdGEtbmF2aWdhdGlvbi1jb250ZW50XScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25Db250ZW50ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbi1kZXNrdG9wW2RhdGEtbmF2aWdhdGlvbi1jb250ZW50XScpO1xuICAgIH1cblxuICAgIHRoaXMuYnJhbmRpbmcgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhlYWRlci1icmFuZGluZ10nKTtcbiAgICB0aGlzLmhlYWRlclRvb2xzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLXRvb2xzJyk7XG5cbiAgICB0aGlzLmhlYWRlclJpZ2h0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZWFkZXItY29udGVudC1yaWdodF0nKTtcblxuICAgIHRoaXMuY2FjaGVkSGVpZ2h0ID0gMDtcbiAgICB0aGlzLmNhY2hlZFN0aWNreUhlaWdodCA9IDA7XG4gICAgdGhpcy5pc0NhY2hlU3RhbGUgPSB0cnVlO1xuXG4gICAgdGhpcy5zZWFyY2ggPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhlYWRlci1zZWFyY2gtdG9nZ2xlXScpO1xuICAgIHRoaXMuc2VhcmNoVGFrZW92ZXJFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLXRha2VvdmVyXScpO1xuICAgIHRoaXMuc2VhcmNoVGFrZW92ZXIgPSBuZXcgU2VhcmNoVGFrZW92ZXIodGhpcy5zZWFyY2hUYWtlb3ZlckVsKTtcbiAgICB0aGlzLmhlYWRlckV2ZW50cy5yZWdpc3Rlcih0aGlzLnNlYXJjaCwgJ2NsaWNrJywgKCkgPT4gdGhpcy5zZWFyY2hUYWtlb3Zlci5vcGVuKCkpO1xuXG4gICAgdGhpcy5lbmFibGVQcmVkaWN0aXZlU2VhcmNoID0gc2VjdGlvbi5kYXRhLmVuYWJsZV9wcmVkaWN0aXZlX3NlYXJjaDtcbiAgICB0aGlzLmhlYWRlclNlYXJjaEZvcm1zID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zZWFyY2gtZm9ybV0nKTtcblxuICAgIGlmICh0aGlzLmVuYWJsZVByZWRpY3RpdmVTZWFyY2ggPT09ICd0cnVlJykge1xuICAgICAgdGhpcy5oZWFkZXJTZWFyY2hGb3Jtcy5mb3JFYWNoKGVsID0+IG5ldyBQcmVkaWN0aXZlU2VhcmNoKHsgZWwgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuaXNTdGlja3lIZWFkZXIgPSBzZWN0aW9uLmRhdGEuc3RpY2t5SGVhZGVyO1xuICAgIHRoaXMuaXNDb21wYWN0Q2VudGVyID0gc2VjdGlvbi5kYXRhLmNvbXBhY3RDZW50ZXIgPT09ICdjb21wYWN0LWNlbnRlcic7XG4gICAgdGhpcy5uYXZIZWlnaHQgPSAwO1xuICAgIHRoaXMud2luZG93V2lkdGggPSB0aGVtZVV0aWxzLndpbmRvd1dpZHRoKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm5hdkhlaWdodCA9IHRoaXMubmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIH0sXG4gICAgMTAwKTtcbiAgICB0aGlzLl9zZXR1cEJyYW5kaW5nKCk7XG4gICAgdGhpcy5fc2V0Q29tcGFjdENlbnRlckhlaWdodHMoKTtcbiAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIodGhpcy5fc2hvdWxkSGVhZGVyU3RpY2soKSk7XG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICAgIHRoaXMucmVsb2FkTmF2aWdhdGlvbigpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHN1cGVyLm9uU2VjdGlvblVubG9hZCgpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUhlYWRlcik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGVhZGVyKTtcbiAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIodGhpcy5fc2hvdWxkSGVhZGVyU3RpY2soKSk7XG4gIH1cblxuICBfYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLnJlc2l6ZUhlYWRlciA9ICgpID0+IHtcbiAgICAgIC8vIFByZXZlbnQgcmVzaXplIGNhdXNlZCBieSBpT1Mgdmlld3BvcnQgY2hhbmdlXG4gICAgICBpZiAodGhlbWVVdGlscy53aW5kb3dXaWR0aCgpID09PSB0aGlzLndpbmRvd1dpZHRoKSB7IHJldHVybjsgfVxuICAgICAgdGhpcy53aW5kb3dXaWR0aCA9IHRoZW1lVXRpbHMud2luZG93V2lkdGgoKTtcblxuICAgICAgdGhpcy5uYXZIZWlnaHQgPSB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgdGhpcy5pc0NhY2hlU3RhbGUgPSB0cnVlO1xuXG4gICAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIodGhpcy5fc2hvdWxkSGVhZGVyU3RpY2soKSk7XG4gICAgICB0aGlzLl9zZXRDb21wYWN0Q2VudGVySGVpZ2h0cygpO1xuICAgIH07XG4gICAgdGhpcy5zY3JvbGxIZWFkZXIgPSAoKSA9PiB7XG4gICAgICAvLyBPbmx5IGNhbGN1bGF0ZSBoZWlnaHRzIG9uIHNjcm9sbCBpZiBzdGlja3kgaGVhZGVyIGlzIGRpc2FibGVkXG4gICAgICBpZiAoIXRoaXMuaXNTdGlja3lIZWFkZXIpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29tcGFjdENlbnRlckhlaWdodHMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RpY2t5IGhlYWRlciBjYWxjdWxhdGVzIGhlaWdodHNcbiAgICAgIHRoaXMuX3RvZ2dsZVN0aWNreUhlYWRlcih0aGlzLl9zaG91bGRIZWFkZXJTdGljaygpKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUhlYWRlcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGVhZGVyKTtcbiAgfVxuXG4gIF9zaG91bGRIZWFkZXJTdGljaygpIHtcbiAgICBsZXQgc2hvdWxkU3RpY2sgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5pc1N0aWNreUhlYWRlcikge1xuICAgICAgcmV0dXJuIHNob3VsZFN0aWNrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2FjaGVTdGFsZSkge1xuICAgICAgbGV0IGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3ktaGVhZGVyJykgPyAwIDogdGhpcy5oZWFkZXJDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgIGxldCBzdGlja3lIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc3RpY2t5LWhlYWRlcicpID8gdGhpcy5oZWFkZXJDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCA6IDA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnc3RpY2t5LWhlYWRlcicpO1xuXG4gICAgICBoZWlnaHQgPSAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSA/IHRoaXMuaGVhZGVyQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgOiBoZWlnaHQ7XG4gICAgICBzdGlja3lIZWlnaHQgPSAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSA/IHN0aWNreUhlaWdodCA6IHRoaXMuaGVhZGVyQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnc3RpY2t5LWhlYWRlcicpO1xuXG4gICAgICB0aGlzLmNhY2hlZEhlaWdodCA9IGhlaWdodDtcbiAgICAgIHRoaXMuY2FjaGVkU3RpY2t5SGVpZ2h0ID0gc3RpY2t5SGVpZ2h0O1xuICAgICAgdGhpcy5pc0NhY2hlU3RhbGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAoKHRoaXMuaGVhZGVyVG9vbHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgdGhpcy5jYWNoZWRIZWlnaHQpIC0gdGhpcy5jYWNoZWRTdGlja3lIZWlnaHQpKSB7XG4gICAgICBzaG91bGRTdGljayA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoZW1lVXRpbHMuaXNMZXNzVGhhbkxhcmdlKCkpIHtcbiAgICAgIHNob3VsZFN0aWNrID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZFN0aWNrO1xuICB9XG5cbiAgX3RvZ2dsZVN0aWNreUhlYWRlcih0b2dnbGVPbikge1xuICAgIGxldCBwYWRkaW5nQm90dG9tO1xuICAgIGlmICh0b2dnbGVPbiA9PSBudWxsKSB7IHRvZ2dsZU9uID0gZmFsc2U7IH1cbiAgICBpZiAodG9nZ2xlT24gJiYgIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3ktaGVhZGVyJykpIHtcbiAgICAgIHBhZGRpbmdCb3R0b20gPSB0aGlzLmNhY2hlZEhlaWdodDtcbiAgICAgIHRoaXMubWFpbkhlYWRlci5zdHlsZS5wYWRkaW5nQm90dG9tID0gYCR7cGFkZGluZ0JvdHRvbX1weGA7XG4gICAgfVxuXG4gICAgaWYgKCF0b2dnbGVPbikge1xuICAgICAgcGFkZGluZ0JvdHRvbSA9IDA7XG4gICAgICB0aGlzLm1haW5IZWFkZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IGAke3BhZGRpbmdCb3R0b219cHhgO1xuICAgIH1cblxuICAgIGlmICh0b2dnbGVPbiAhPT0gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSkge1xuICAgICAgaWYgKHRvZ2dsZU9uKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnc3RpY2t5LWhlYWRlcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzdGlja3ktaGVhZGVyJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXRDb21wYWN0Q2VudGVySGVpZ2h0cyghdG9nZ2xlT24pO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAgICAgIE1hdGNoIE5hdmlnYXRpb24gYW5kIEJyYW5kaW5nIGhlaWdodHNcbiAgICAgICAgQ2VudGVyIG5hdmlnYXRpb24gdmVydGljYWxseSBpZiBCcmFuZGluZyBpcyB0YWxsZXJcbiAgICAgICAgKi9cbiAgX3NldENvbXBhY3RDZW50ZXJIZWlnaHRzKHRvZ2dsZU9uKSB7XG4gICAgaWYgKHRvZ2dsZU9uID09IG51bGwpIHsgdG9nZ2xlT24gPSB0cnVlOyB9XG4gICAgaWYgKCF0aGlzLmlzQ29tcGFjdENlbnRlcikgeyByZXR1cm47IH1cblxuICAgIGxldCBtaW5IZWlnaHQgPSAnYXV0byc7XG5cbiAgICAvLyBHZXQgaGVpZ2h0IG9mIGlubmVyIG5hdmlnYXRpb24gdG8gcHJldmVudCBoZWlnaHQgbG9ja2luZyBvbiB0d28gcm93IG5hdmlnYXRpb25cbiAgICBjb25zdCBuYXZIZWlnaHQgPSB0aGlzLm5hdmlnYXRpb25Db250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBsZXQgbmF2T2Zmc2V0ID0gJ2F1dG8nO1xuXG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpICYmIHRvZ2dsZU9uKSB7XG4gICAgICBjb25zdCBsb2dvSW1nID0gdGhpcy5icmFuZGluZy5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICAgIGlmIChsb2dvSW1nICYmICFsb2dvSW1nLmNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyRXZlbnRzLnJlZ2lzdGVyKGxvZ29JbWcsICdsb2FkJywgKCkgPT4gdGhpcy5fc2V0Q29tcGFjdENlbnRlckhlaWdodHMoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoZWlnaHRzID0gW107XG4gICAgICBoZWlnaHRzLnB1c2gobmF2SGVpZ2h0KTtcbiAgICAgIGhlaWdodHMucHVzaCh0aGlzLmJyYW5kaW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG5cbiAgICAgIG1pbkhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuICAgIH1cblxuICAgIGlmIChuYXZIZWlnaHQgPCBtaW5IZWlnaHQpIHtcbiAgICAgIG5hdk9mZnNldCA9IChtaW5IZWlnaHQgLSBuYXZIZWlnaHQpIC8gMjtcbiAgICB9XG5cbiAgICB0aGlzLm5hdkhlaWdodCA9IHRoaXMubmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgaWYgKHRoaXMuaXNTdGlja3lIZWFkZXIgJiYgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSkge1xuICAgICAgdGhpcy5oZWFkZXJDb250ZW50LnN0eWxlLm1pbkhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuc3R5bGUubWFyZ2luVG9wID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJDb250ZW50LnN0eWxlLm1pbkhlaWdodCA9IGAke21pbkhlaWdodH1weGA7XG4gICAgICB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLnN0eWxlLm1hcmdpblRvcCA9IGAke25hdk9mZnNldH1weGA7XG4gICAgfVxuICB9XG5cbiAgX3NldHVwQnJhbmRpbmcoKSB7XG4gICAgLy8gQ2xvbmUgZGVza3RvcCBicmFuZGluZyB0byBtb2JpbGVcbiAgICBjb25zdCBtb2JpbGVCcmFuZGluZyA9IHRoaXMuYnJhbmRpbmcuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgbW9iaWxlQnJhbmRpbmcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhlYWRlci1icmFuZGluZycpO1xuICAgIG1vYmlsZUJyYW5kaW5nLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1icmFuZGluZy1kZXNrdG9wJyk7XG4gICAgbW9iaWxlQnJhbmRpbmcuY2xhc3NMaXN0LmFkZCgnaGVhZGVyLWJyYW5kaW5nLW1vYmlsZScpO1xuXG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5pbnNlcnRCZWZvcmUobW9iaWxlQnJhbmRpbmcsIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyTUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticHeader.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticNavigation.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/sections/StaticNavigation.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticNavigation)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\nclass StaticNavigation {\n constructor(section) {\n this.el = section.el;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.navigationWrapper = this.el.querySelector('[data-navigation-wrapper]');\n if (!this.navigationWrapper) return;\n this.navigationWrapper.classList.add('navigation--loading');\n this.reloadNavigation();\n this.navigationWrapper.classList.remove('navigation--loading');\n this.navigationWrapper.classList.add('navigation--loaded');\n }\n\n reloadNavigation() {\n this.events.unregisterAll();\n\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n this.navigationContent = this.el.querySelector('.navigation-desktop[data-navigation-content]');\n const headerBranding = document.querySelector('[data-header-branding]');\n headerBranding.parentNode.insertBefore(this.navigationWrapper, headerBranding.nextSibling);\n const megaNavs = this.navigationContent.querySelectorAll('li[data-mega-nav=\"true\"]');\n megaNavs.forEach(el => {\n el.classList.remove('has-dropdown');\n el.classList.add('has-mega-nav');\n });\n } else {\n this.navigationContent = this.el.querySelector('.navigation-mobile[data-navigation-content]');\n const headerMain = document.querySelector('[data-header-main]');\n headerMain.parentNode.insertBefore(this.navigationWrapper, headerMain.nextSibling);\n const megaNavs = this.navigationContent.querySelectorAll('li[data-mega-nav=\"true\"]');\n megaNavs.forEach(el => {\n el.classList.add('has-dropdown');\n el.classList.remove('has-mega-nav');\n });\n }\n\n this.el.querySelectorAll('.mega-nav-list li a, .mega-nav-list li summary').forEach(anchor => this.events.register(anchor, 'mouseover', this._onMegaNavAnchorMouseover.bind(this)));\n this.el.querySelectorAll('.mega-nav-list a, .mega-nav-list summary').forEach(anchor => this.events.register(anchor, 'mouseleave', this._onMegaNavAnchorMouseleave.bind(this)));\n this.el.querySelectorAll('[data-header-nav-toggle]').forEach(toggle => this.events.register(toggle, 'click', this._onMobileNavigationClick.bind(this)));\n this.events.register(window, 'resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._onResize.bind(this), 500));\n const currentCloseAction = {\n el: null,\n timeout: null\n };\n this.el.querySelectorAll('.has-dropdown, .has-mega-nav').forEach(toggle => this.events.register(toggle, 'mouseenter', event => {\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) return;\n const {\n currentTarget\n } = event;\n\n if (currentCloseAction.el && currentCloseAction.timeout) {\n clearTimeout(currentCloseAction.timeout);\n\n this._closeDropdown(currentCloseAction.el);\n\n currentCloseAction.el = null;\n currentCloseAction.timeout = null;\n }\n\n if (currentTarget.classList.contains('has-mega-nav')) {\n this._swapMegaNavImages(currentTarget.querySelector('.mega-nav-image img'));\n }\n\n this._openDropdown(currentTarget);\n }));\n this.el.querySelectorAll('.has-dropdown, .has-mega-nav').forEach(toggle => this.events.register(toggle, 'mouseleave', event => {\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) return;\n const {\n currentTarget\n } = event;\n\n if (currentCloseAction.el && currentCloseAction.timeout) {\n // Don't add another action for an element that is nested within a currently closing dropdown\n if (currentCloseAction.el.contains(currentTarget)) return;\n clearTimeout(currentCloseAction.timeout); // Close the current dropdown if one exists and hasn't been run, but only if it isn't a child of this new event\n\n if (!currentTarget.contains(currentCloseAction.el)) {\n this._closeDropdown(currentCloseAction.el);\n }\n }\n\n currentCloseAction.el = currentTarget;\n currentCloseAction.timeout = setTimeout(() => {\n this._closeDropdown(currentCloseAction.el);\n\n currentCloseAction.el = null;\n currentCloseAction.timeout = null;\n }, 400);\n }));\n this.detailsElements = this.el.querySelectorAll('[data-nav-details]');\n this.firstLevelDetails = [...this.el.querySelectorAll('.navigation-menu > .has-dropdown > [data-nav-details]')];\n\n this.click = e => {\n e.stopPropagation();\n const clickedParent = e.target.closest('.navigation-menu-link');\n const clickedDetailsEl = e.target.closest('[data-nav-details]'); // Close siblings\n\n if (this.firstLevelDetails.includes(clickedDetailsEl)) {\n this.firstLevelDetails.forEach(detailsElement => {\n const details = detailsElement;\n\n if (details !== clickedDetailsEl) {\n details.open = false;\n }\n });\n } // If the link being clicked is a parent link, then take control of the navigation\n\n\n if (clickedParent && clickedParent.dataset.href) {\n e.preventDefault(); // if already open, continue to link destination\n\n if (clickedDetailsEl.open) {\n window.location = clickedParent.dataset.href;\n return;\n } // If the submenu isn't open, open it\n\n\n clickedDetailsEl.open = true;\n }\n };\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLarge()) {\n // Adding click event for details elements on desktop\n this.detailsElements.forEach(detailsElement => this.events.register(detailsElement, 'click', event => this.click(event)));\n this.detailsElements.forEach(detailsElement => this.events.register(detailsElement, 'touchend', e => this.click(e)));\n }\n\n this.el.querySelectorAll('.has-dropdown > a > [data-subnav-toggle]').forEach(toggle => this.events.register(toggle, 'click', event => {\n event.stopPropagation();\n event.preventDefault();\n const {\n currentTarget\n } = event;\n const triggerEl = currentTarget.parentElement.parentElement;\n\n if (triggerEl.classList.contains('has-dropdown--active')) {\n this._closeDropdown(triggerEl);\n } else {\n this._openDropdown(triggerEl);\n }\n }));\n this.el.querySelectorAll('.navigation-submenu').forEach(toggle => this.events.register(toggle, 'revealer-animating', event => {\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n return;\n }\n\n const {\n currentTarget: dropdown\n } = event;\n\n if (!dropdown.classList.contains('animating-in')) {\n return;\n }\n\n dropdown.classList.remove('navigation-submenu-open-left');\n dropdown.style.opacity = 0;\n dropdown.style.display = 'block';\n const navigationWidth = this.navigationWrapper.getBoundingClientRect().width;\n const offset = dropdown.getBoundingClientRect().left + window.pageXOffset;\n\n if (offset + 200 > navigationWidth) {\n dropdown.classList.add('navigation-submenu-open-left');\n }\n\n dropdown.style.opacity = '';\n dropdown.style.display = '';\n }));\n }\n\n onSectionDeselect() {\n this._toggleMobileNavigation('close');\n }\n\n onSectionUnload() {\n this.events.unregisterAll();\n\n this._toggleMobileNavigation('close');\n }\n\n _onResize() {\n if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n this._toggleMobileNavigation('close');\n }\n\n this.reloadNavigation();\n }\n\n _onMegaNavAnchorMouseover(e) {\n this._swapMegaNavImages(e.currentTarget.parentNode);\n }\n\n _onMegaNavAnchorMouseleave(e) {\n const megaNavImage = e.target.closest('.mega-nav').querySelector('.mega-nav-image img');\n if (!megaNavImage) return;\n megaNavImage.setAttribute('src', megaNavImage.dataset.image);\n megaNavImage.setAttribute('alt', megaNavImage.dataset.alt);\n }\n\n _onMobileNavigationClick() {\n this._toggleMobileNavigation();\n }\n\n _openDropdown(triggerEl) {\n triggerEl.classList.add('has-dropdown--active');\n const navigationSubmenuToggle = triggerEl.querySelector('.navigation-submenu-toggle');\n\n if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n const dropdown = triggerEl.querySelector('.navigation-submenu');\n triggerEl.classList.add('has-mobile-dropdown--active');\n dropdown.classList.add('navigation-submenu-visible');\n\n this._setTierHeight();\n } else {\n const megaNav = triggerEl.querySelector('.mega-nav');\n const dropdown = triggerEl.querySelector('.navigation-submenu');\n\n if (megaNav) {\n megaNav.classList.add('visible');\n } else {\n dropdown.classList.add('navigation-submenu-visible');\n dropdown.classList.add('visible');\n }\n }\n\n navigationSubmenuToggle.setAttribute('aria-expanded', true);\n this.details = triggerEl.querySelector('[data-nav-details]');\n\n if (this.details && _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLarge()) {\n this.details.open = true;\n }\n }\n\n _closeDropdown(triggerEl) {\n triggerEl.classList.remove('has-dropdown--active');\n triggerEl.querySelectorAll('.has-dropdown, .has-mega-nav').forEach(innerTriggerEl => this._closeDropdown(innerTriggerEl));\n const dropdown = triggerEl.querySelector('.navigation-submenu');\n const megaNav = triggerEl.querySelector('.mega-nav');\n const navigationSubmenuToggle = triggerEl.querySelector('.navigation-submenu-toggle');\n\n if (dropdown) {\n dropdown.classList.remove('navigation-submenu-visible');\n dropdown.classList.remove('visible');\n }\n\n triggerEl.classList.remove('has-mobile-dropdown--active');\n\n if (megaNav) {\n megaNav.classList.remove('visible');\n }\n\n this._setTierHeight();\n\n if (navigationSubmenuToggle) {\n navigationSubmenuToggle.setAttribute('aria-expanded', false);\n }\n\n this.details = triggerEl.querySelector('[data-nav-details]');\n\n if (this.details && _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLarge()) {\n this.details.open = false;\n }\n }\n\n _toggleMobileNavigation(force = null) {\n if (document.body.classList.contains('mobile-nav-open') && force !== 'open') {\n this.navigationContent.removeAttribute('style');\n document.body.classList.remove('mobile-nav-open');\n document.body.classList.remove('lock-scroll');\n this.navigationContent.classList.remove('visible');\n this.navigationWrapper.classList.remove('visible');\n this.navigationWrapper.classList.remove('background'); // Close opened menus on navigation close\n\n this.navigationContent.querySelectorAll('.has-dropdown--active').forEach(triggerEl => this._closeDropdown(triggerEl));\n } else if (!document.body.classList.contains('mobile-nav-open') && force !== 'close') {\n document.body.classList.add('mobile-nav-open');\n document.body.classList.add('lock-scroll');\n this.navigationWrapper.classList.add('visible');\n this.navigationWrapper.classList.add('background');\n this.navigationContent.classList.add('visible');\n\n this._setTierHeight();\n }\n }\n\n _setTierHeight() {\n this.navigationContent.style.overflowY = scroll;\n this.navigationContent.style.height = '100%';\n }\n\n _swapMegaNavImages(target) {\n if (!target) return;\n const {\n image,\n imageAlt\n } = target.dataset;\n\n if (image && image !== '') {\n const megaNavImg = target.closest('.mega-nav').querySelector('.mega-nav-image img');\n if (!megaNavImg) return;\n megaNavImg.setAttribute('src', image);\n megaNavImg.setAttribute('srcset', '');\n megaNavImg.setAttribute('alt', imageAlt);\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNOYXZpZ2F0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY05hdmlnYXRpb24uanM/Yjk0MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljTmF2aWdhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcblxuICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5hdmlnYXRpb24td3JhcHBlcl0nKTtcblxuICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uV3JhcHBlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5uYXZpZ2F0aW9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLS1sb2FkaW5nJyk7XG5cbiAgICB0aGlzLnJlbG9hZE5hdmlnYXRpb24oKTtcblxuICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnbmF2aWdhdGlvbi0tbG9hZGluZycpO1xuICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi0tbG9hZGVkJyk7XG4gIH1cblxuICByZWxvYWROYXZpZ2F0aW9uKCkge1xuICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXJBbGwoKTtcblxuICAgIGlmICghdGhlbWVVdGlscy5pc0xlc3NUaGFuTGFyZ2UoKSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tZGVza3RvcFtkYXRhLW5hdmlnYXRpb24tY29udGVudF0nKTtcblxuICAgICAgY29uc3QgaGVhZGVyQnJhbmRpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZWFkZXItYnJhbmRpbmddJyk7XG5cbiAgICAgIGhlYWRlckJyYW5kaW5nLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubmF2aWdhdGlvbldyYXBwZXIsIGhlYWRlckJyYW5kaW5nLm5leHRTaWJsaW5nKTtcblxuICAgICAgY29uc3QgbWVnYU5hdnMgPSB0aGlzLm5hdmlnYXRpb25Db250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpW2RhdGEtbWVnYS1uYXY9XCJ0cnVlXCJdJyk7XG5cbiAgICAgIG1lZ2FOYXZzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZHJvcGRvd24nKTtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnaGFzLW1lZ2EtbmF2Jyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tbW9iaWxlW2RhdGEtbmF2aWdhdGlvbi1jb250ZW50XScpO1xuXG4gICAgICBjb25zdCBoZWFkZXJNYWluID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtaGVhZGVyLW1haW5dJyk7XG5cbiAgICAgIGhlYWRlck1haW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5uYXZpZ2F0aW9uV3JhcHBlciwgaGVhZGVyTWFpbi5uZXh0U2libGluZyk7XG5cbiAgICAgIGNvbnN0IG1lZ2FOYXZzID0gdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaVtkYXRhLW1lZ2EtbmF2PVwidHJ1ZVwiXScpO1xuXG4gICAgICBtZWdhTmF2cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnaGFzLWRyb3Bkb3duJyk7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1tZWdhLW5hdicpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYS1uYXYtbGlzdCBsaSBhLCAubWVnYS1uYXYtbGlzdCBsaSBzdW1tYXJ5JykuZm9yRWFjaChhbmNob3IgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIoYW5jaG9yLCAnbW91c2VvdmVyJywgdGhpcy5fb25NZWdhTmF2QW5jaG9yTW91c2VvdmVyLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhLW5hdi1saXN0IGEsIC5tZWdhLW5hdi1saXN0IHN1bW1hcnknKS5mb3JFYWNoKGFuY2hvciA9PiB0aGlzLmV2ZW50cy5yZWdpc3RlcihhbmNob3IsICdtb3VzZWxlYXZlJywgdGhpcy5fb25NZWdhTmF2QW5jaG9yTW91c2VsZWF2ZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1oZWFkZXItbmF2LXRvZ2dsZV0nKS5mb3JFYWNoKHRvZ2dsZSA9PiB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0b2dnbGUsICdjbGljaycsIHRoaXMuX29uTW9iaWxlTmF2aWdhdGlvbkNsaWNrLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksIDUwMCkpO1xuXG4gICAgY29uc3QgY3VycmVudENsb3NlQWN0aW9uID0ge1xuICAgICAgZWw6IG51bGwsXG4gICAgICB0aW1lb3V0OiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWRyb3Bkb3duLCAuaGFzLW1lZ2EtbmF2JykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAnbW91c2VlbnRlcicsIGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChjdXJyZW50Q2xvc2VBY3Rpb24uZWwgJiYgY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGN1cnJlbnRDbG9zZUFjdGlvbi50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bihjdXJyZW50Q2xvc2VBY3Rpb24uZWwpO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24uZWwgPSBudWxsO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24udGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50VGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnaGFzLW1lZ2EtbmF2JykpIHtcbiAgICAgICAgdGhpcy5fc3dhcE1lZ2FOYXZJbWFnZXMoY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCcubWVnYS1uYXYtaW1hZ2UgaW1nJykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vcGVuRHJvcGRvd24oY3VycmVudFRhcmdldCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWRyb3Bkb3duLCAuaGFzLW1lZ2EtbmF2JykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAnbW91c2VsZWF2ZScsIGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChjdXJyZW50Q2xvc2VBY3Rpb24uZWwgJiYgY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQpIHtcbiAgICAgICAgLy8gRG9uJ3QgYWRkIGFub3RoZXIgYWN0aW9uIGZvciBhbiBlbGVtZW50IHRoYXQgaXMgbmVzdGVkIHdpdGhpbiBhIGN1cnJlbnRseSBjbG9zaW5nIGRyb3Bkb3duXG4gICAgICAgIGlmIChjdXJyZW50Q2xvc2VBY3Rpb24uZWwuY29udGFpbnMoY3VycmVudFRhcmdldCkpIHJldHVybjtcblxuICAgICAgICBjbGVhclRpbWVvdXQoY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQpO1xuXG4gICAgICAgIC8vIENsb3NlIHRoZSBjdXJyZW50IGRyb3Bkb3duIGlmIG9uZSBleGlzdHMgYW5kIGhhc24ndCBiZWVuIHJ1biwgYnV0IG9ubHkgaWYgaXQgaXNuJ3QgYSBjaGlsZCBvZiB0aGlzIG5ldyBldmVudFxuICAgICAgICBpZiAoIWN1cnJlbnRUYXJnZXQuY29udGFpbnMoY3VycmVudENsb3NlQWN0aW9uLmVsKSkge1xuICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oY3VycmVudENsb3NlQWN0aW9uLmVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjdXJyZW50Q2xvc2VBY3Rpb24uZWwgPSBjdXJyZW50VGFyZ2V0O1xuICAgICAgY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bihjdXJyZW50Q2xvc2VBY3Rpb24uZWwpO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24uZWwgPSBudWxsO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24udGltZW91dCA9IG51bGw7XG4gICAgICB9LCA0MDApO1xuICAgIH0pKTtcblxuICAgIHRoaXMuZGV0YWlsc0VsZW1lbnRzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1uYXYtZGV0YWlsc10nKTtcblxuICAgIHRoaXMuZmlyc3RMZXZlbERldGFpbHMgPSBbLi4udGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2aWdhdGlvbi1tZW51ID4gLmhhcy1kcm9wZG93biA+IFtkYXRhLW5hdi1kZXRhaWxzXScpXTtcblxuICAgIHRoaXMuY2xpY2sgPSBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRQYXJlbnQgPSBlLnRhcmdldC5jbG9zZXN0KCcubmF2aWdhdGlvbi1tZW51LWxpbmsnKTtcbiAgICAgIGNvbnN0IGNsaWNrZWREZXRhaWxzRWwgPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1uYXYtZGV0YWlsc10nKTtcblxuICAgICAgLy8gQ2xvc2Ugc2libGluZ3NcbiAgICAgIGlmICh0aGlzLmZpcnN0TGV2ZWxEZXRhaWxzLmluY2x1ZGVzKGNsaWNrZWREZXRhaWxzRWwpKSB7XG4gICAgICAgIHRoaXMuZmlyc3RMZXZlbERldGFpbHMuZm9yRWFjaChkZXRhaWxzRWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRldGFpbHNFbGVtZW50O1xuICAgICAgICAgIGlmIChkZXRhaWxzICE9PSBjbGlja2VkRGV0YWlsc0VsKSB7XG4gICAgICAgICAgICBkZXRhaWxzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgbGluayBiZWluZyBjbGlja2VkIGlzIGEgcGFyZW50IGxpbmssIHRoZW4gdGFrZSBjb250cm9sIG9mIHRoZSBuYXZpZ2F0aW9uXG4gICAgICBpZiAoY2xpY2tlZFBhcmVudCAmJiBjbGlja2VkUGFyZW50LmRhdGFzZXQuaHJlZikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIGlmIGFscmVhZHkgb3BlbiwgY29udGludWUgdG8gbGluayBkZXN0aW5hdGlvblxuICAgICAgICBpZiAoY2xpY2tlZERldGFpbHNFbC5vcGVuKSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gY2xpY2tlZFBhcmVudC5kYXRhc2V0LmhyZWY7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHN1Ym1lbnUgaXNuJ3Qgb3Blbiwgb3BlbiBpdFxuICAgICAgICBjbGlja2VkRGV0YWlsc0VsLm9wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhlbWVVdGlscy5pc0xhcmdlKCkpIHtcbiAgICAgIC8vIEFkZGluZyBjbGljayBldmVudCBmb3IgZGV0YWlscyBlbGVtZW50cyBvbiBkZXNrdG9wXG4gICAgICB0aGlzLmRldGFpbHNFbGVtZW50cy5mb3JFYWNoKGRldGFpbHNFbGVtZW50ID0+IHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGRldGFpbHNFbGVtZW50LCAnY2xpY2snLCBldmVudCA9PiB0aGlzLmNsaWNrKGV2ZW50KSkpO1xuICAgICAgdGhpcy5kZXRhaWxzRWxlbWVudHMuZm9yRWFjaChkZXRhaWxzRWxlbWVudCA9PiB0aGlzLmV2ZW50cy5yZWdpc3RlcihkZXRhaWxzRWxlbWVudCwgJ3RvdWNoZW5kJywgZSA9PiB0aGlzLmNsaWNrKGUpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWRyb3Bkb3duID4gYSA+IFtkYXRhLXN1Ym5hdi10b2dnbGVdJykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAnY2xpY2snLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG4gICAgICBjb25zdCB0cmlnZ2VyRWwgPSBjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgaWYgKHRyaWdnZXJFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hhcy1kcm9wZG93bi0tYWN0aXZlJykpIHtcbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bih0cmlnZ2VyRWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fb3BlbkRyb3Bkb3duKHRyaWdnZXJFbCk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2aWdhdGlvbi1zdWJtZW51JykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAncmV2ZWFsZXItYW5pbWF0aW5nJywgZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoZW1lVXRpbHMuaXNMZXNzVGhhbkxhcmdlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQ6IGRyb3Bkb3duIH0gPSBldmVudDtcblxuICAgICAgaWYgKCFkcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoJ2FuaW1hdGluZy1pbicpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnbmF2aWdhdGlvbi1zdWJtZW51LW9wZW4tbGVmdCcpO1xuICAgICAgZHJvcGRvd24uc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIGNvbnN0IG5hdmlnYXRpb25XaWR0aCA9IHRoaXMubmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICBjb25zdCBvZmZzZXQgPSBkcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0O1xuXG4gICAgICBpZiAoKG9mZnNldCArIDIwMCkgPiBuYXZpZ2F0aW9uV2lkdGgpIHtcbiAgICAgICAgZHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi1zdWJtZW51LW9wZW4tbGVmdCcpO1xuICAgICAgfVxuXG4gICAgICBkcm9wZG93bi5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfSkpO1xuICB9XG5cbiAgb25TZWN0aW9uRGVzZWxlY3QoKSB7XG4gICAgdGhpcy5fdG9nZ2xlTW9iaWxlTmF2aWdhdGlvbignY2xvc2UnKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgdGhpcy5fdG9nZ2xlTW9iaWxlTmF2aWdhdGlvbignY2xvc2UnKTtcbiAgfVxuXG4gIF9vblJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoZW1lVXRpbHMuaXNMZXNzVGhhbkxhcmdlKCkpIHtcbiAgICAgIHRoaXMuX3RvZ2dsZU1vYmlsZU5hdmlnYXRpb24oJ2Nsb3NlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxvYWROYXZpZ2F0aW9uKCk7XG4gIH1cblxuICBfb25NZWdhTmF2QW5jaG9yTW91c2VvdmVyKGUpIHtcbiAgICB0aGlzLl9zd2FwTWVnYU5hdkltYWdlcyhlLmN1cnJlbnRUYXJnZXQucGFyZW50Tm9kZSk7XG4gIH1cblxuICBfb25NZWdhTmF2QW5jaG9yTW91c2VsZWF2ZShlKSB7XG4gICAgY29uc3QgbWVnYU5hdkltYWdlID0gZS50YXJnZXRcbiAgICAgIC5jbG9zZXN0KCcubWVnYS1uYXYnKVxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhLW5hdi1pbWFnZSBpbWcnKTtcblxuICAgIGlmICghbWVnYU5hdkltYWdlKSByZXR1cm47XG5cbiAgICBtZWdhTmF2SW1hZ2Uuc2V0QXR0cmlidXRlKCdzcmMnLCBtZWdhTmF2SW1hZ2UuZGF0YXNldC5pbWFnZSk7XG4gICAgbWVnYU5hdkltYWdlLnNldEF0dHJpYnV0ZSgnYWx0JywgbWVnYU5hdkltYWdlLmRhdGFzZXQuYWx0KTtcbiAgfVxuXG4gIF9vbk1vYmlsZU5hdmlnYXRpb25DbGljaygpIHtcbiAgICB0aGlzLl90b2dnbGVNb2JpbGVOYXZpZ2F0aW9uKCk7XG4gIH1cblxuICBfb3BlbkRyb3Bkb3duKHRyaWdnZXJFbCkge1xuICAgIHRyaWdnZXJFbC5jbGFzc0xpc3QuYWRkKCdoYXMtZHJvcGRvd24tLWFjdGl2ZScpO1xuXG4gICAgY29uc3QgbmF2aWdhdGlvblN1Ym1lbnVUb2dnbGUgPSB0cmlnZ2VyRWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tc3VibWVudS10b2dnbGUnKTtcblxuICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSB7XG4gICAgICBjb25zdCBkcm9wZG93biA9IHRyaWdnZXJFbC5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbi1zdWJtZW51Jyk7XG4gICAgICB0cmlnZ2VyRWwuY2xhc3NMaXN0LmFkZCgnaGFzLW1vYmlsZS1kcm9wZG93bi0tYWN0aXZlJyk7XG4gICAgICBkcm9wZG93bi5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLXN1Ym1lbnUtdmlzaWJsZScpO1xuICAgICAgdGhpcy5fc2V0VGllckhlaWdodCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZWdhTmF2ID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhLW5hdicpO1xuICAgICAgY29uc3QgZHJvcGRvd24gPSB0cmlnZ2VyRWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tc3VibWVudScpO1xuXG4gICAgICBpZiAobWVnYU5hdikge1xuICAgICAgICBtZWdhTmF2LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ25hdmlnYXRpb24tc3VibWVudS12aXNpYmxlJyk7XG4gICAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuYXZpZ2F0aW9uU3VibWVudVRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcblxuICAgIHRoaXMuZGV0YWlscyA9IHRyaWdnZXJFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uYXYtZGV0YWlsc10nKTtcbiAgICBpZiAodGhpcy5kZXRhaWxzICYmIHRoZW1lVXRpbHMuaXNMYXJnZSgpKSB7XG4gICAgICB0aGlzLmRldGFpbHMub3BlbiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgX2Nsb3NlRHJvcGRvd24odHJpZ2dlckVsKSB7XG4gICAgdHJpZ2dlckVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1kcm9wZG93bi0tYWN0aXZlJyk7XG4gICAgdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZHJvcGRvd24sIC5oYXMtbWVnYS1uYXYnKS5mb3JFYWNoKGlubmVyVHJpZ2dlckVsID0+IHRoaXMuX2Nsb3NlRHJvcGRvd24oaW5uZXJUcmlnZ2VyRWwpKTtcblxuICAgIGNvbnN0IGRyb3Bkb3duID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5uYXZpZ2F0aW9uLXN1Ym1lbnUnKTtcbiAgICBjb25zdCBtZWdhTmF2ID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhLW5hdicpO1xuICAgIGNvbnN0IG5hdmlnYXRpb25TdWJtZW51VG9nZ2xlID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5uYXZpZ2F0aW9uLXN1Ym1lbnUtdG9nZ2xlJyk7XG5cbiAgICBpZiAoZHJvcGRvd24pIHtcbiAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5yZW1vdmUoJ25hdmlnYXRpb24tc3VibWVudS12aXNpYmxlJyk7XG4gICAgICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfVxuXG4gICAgdHJpZ2dlckVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1tb2JpbGUtZHJvcGRvd24tLWFjdGl2ZScpO1xuXG4gICAgaWYgKG1lZ2FOYXYpIHtcbiAgICAgIG1lZ2FOYXYuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRUaWVySGVpZ2h0KCk7XG5cbiAgICBpZiAobmF2aWdhdGlvblN1Ym1lbnVUb2dnbGUpIHtcbiAgICAgIG5hdmlnYXRpb25TdWJtZW51VG9nZ2xlLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmRldGFpbHMgPSB0cmlnZ2VyRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbmF2LWRldGFpbHNdJyk7XG4gICAgaWYgKHRoaXMuZGV0YWlscyAmJiB0aGVtZVV0aWxzLmlzTGFyZ2UoKSkge1xuICAgICAgdGhpcy5kZXRhaWxzLm9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBfdG9nZ2xlTW9iaWxlTmF2aWdhdGlvbihmb3JjZSA9IG51bGwpIHtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ21vYmlsZS1uYXYtb3BlbicpICYmIGZvcmNlICE9PSAnb3BlbicpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGUtbmF2LW9wZW4nKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbG9jay1zY3JvbGwnKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2JhY2tncm91bmQnKTtcblxuICAgICAgLy8gQ2xvc2Ugb3BlbmVkIG1lbnVzIG9uIG5hdmlnYXRpb24gY2xvc2VcbiAgICAgIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLmhhcy1kcm9wZG93bi0tYWN0aXZlJykuZm9yRWFjaCh0cmlnZ2VyRWwgPT4gdGhpcy5fY2xvc2VEcm9wZG93bih0cmlnZ2VyRWwpKTtcbiAgICB9IGVsc2UgaWYgKCFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnbW9iaWxlLW5hdi1vcGVuJykgJiYgZm9yY2UgIT09ICdjbG9zZScpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbW9iaWxlLW5hdi1vcGVuJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xvY2stc2Nyb2xsJyk7XG4gICAgICB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnYmFja2dyb3VuZCcpO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICB0aGlzLl9zZXRUaWVySGVpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgX3NldFRpZXJIZWlnaHQoKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5zdHlsZS5vdmVyZmxvd1kgPSBzY3JvbGw7XG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gIH1cblxuICBfc3dhcE1lZ2FOYXZJbWFnZXModGFyZ2V0KSB7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGNvbnN0IHsgaW1hZ2UsIGltYWdlQWx0IH0gPSB0YXJnZXQuZGF0YXNldDtcblxuICAgIGlmIChpbWFnZSAmJiAoaW1hZ2UgIT09ICcnKSkge1xuICAgICAgY29uc3QgbWVnYU5hdkltZyA9IHRhcmdldC5jbG9zZXN0KCcubWVnYS1uYXYnKS5xdWVyeVNlbGVjdG9yKCcubWVnYS1uYXYtaW1hZ2UgaW1nJyk7XG5cbiAgICAgIGlmICghbWVnYU5hdkltZykgcmV0dXJuO1xuXG4gICAgICBtZWdhTmF2SW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgaW1hZ2UpO1xuICAgICAgbWVnYU5hdkltZy5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsICcnKTtcbiAgICAgIG1lZ2FOYXZJbWcuc2V0QXR0cmlidXRlKCdhbHQnLCBpbWFnZUFsdCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlUQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticNavigation.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticProductRecommendations.js":
+/*!*****************************************************************!*\
+ !*** ./source/scripts/sections/StaticProductRecommendations.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticProductRecommendations)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n/* harmony import */ var _components_ProductMasonry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/ProductMasonry */ \"./source/scripts/components/ProductMasonry.js\");\n // eslint-disable-line\n\n\n\n\nclass StaticProductRecommendations {\n constructor(section) {\n this.el = section.el;\n this.data = section.data;\n\n this._init();\n\n this.recommendUrl = `${window.Theme.routes.product_recommendations_url}?section_id=${section.id}&product_id=${this.productId}`;\n this._reloadRecommendations = this._reloadRecommendations.bind(this);\n window.addEventListener('shopify:section:load', this._reloadRecommendations);\n\n this._loadRecommendations();\n }\n\n remove() {\n this.productListItems.forEach(item => item.remove());\n }\n\n _init() {\n this.productId = this.data.productId;\n this.positionedRight = this.data.positionRight;\n this.productSectionDataEl = document.querySelector('[data-section-type=\"product\"]');\n this.productSectionIsPresent = !!this.productSectionDataEl;\n let productSectionData; // The product section can be hidden so we default to using the 'standard'\n // recommended products section (the one that's not right-aligned).\n\n if (this.productSectionIsPresent) {\n productSectionData = JSON.parse(this.productSectionDataEl.innerHTML);\n this.use_masonry = productSectionData.images_layout === 'masonry';\n\n if (this.use_masonry) {\n this.positionedRight = false;\n }\n\n const productSectionEl = this.productSectionDataEl.parentElement;\n this.productContainerEl = productSectionEl.querySelector('.product-container');\n this.productContainerEl.classList.add(`product-recommendations-position-${this.positionedRight ? 'right' : 'section'}`);\n this.rightRecommendationContainer = productSectionEl.querySelector('[data-product-recommendations-right]');\n this.rightRecommendationContainer.innerHTML = '';\n } else {\n this.use_masonry = false;\n }\n\n if (this.use_masonry || !this.productSectionIsPresent) {\n this.positionedRight = false;\n }\n\n this.sectionRecommendationContainer = this.el.querySelector('[data-product-recommendations-section]');\n }\n\n _loadRecommendations() {\n _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__.default.load(this.recommendUrl, {\n view: ''\n }).then(response => {\n if (!response) return;\n const {\n html\n } = response;\n\n if (!html.common) {\n return;\n }\n\n const tempContainer = document.createElement('div');\n tempContainer.innerHTML = html.common;\n const productsWrapper = tempContainer.querySelector('.product-recommendations');\n\n if (!this.positionedRight || this.use_masonry) {\n productsWrapper.innerHTML = html.below;\n } else {\n productsWrapper.innerHTML = html.right;\n }\n\n if (this.use_masonry) {\n productsWrapper.classList.remove('row-of-4');\n productsWrapper.classList.add('row-of-3');\n } else {\n // Remove extra products for non-masonry layouts\n productsWrapper.querySelectorAll('[data-masonry-only]').forEach(product => product.parentNode.removeChild(product));\n }\n\n if (this.positionedRight) {\n this.rightRecommendationContainer.innerHTML = tempContainer.innerHTML;\n } else {\n this.sectionRecommendationContainer.innerHTML = tempContainer.innerHTML;\n }\n\n if (this.use_masonry) {\n this.productMasonry = new _components_ProductMasonry__WEBPACK_IMPORTED_MODULE_3__.default({\n el: this.sectionRecommendationContainer\n });\n }\n\n let productItems;\n\n if (this.positionedRight) {\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.rightRecommendationContainer);\n productItems = this.rightRecommendationContainer.querySelectorAll('.product-list-item');\n } else {\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.sectionRecommendationContainer);\n productItems = this.sectionRecommendationContainer.querySelectorAll('.product-list-item');\n }\n\n this.productListItems = [];\n this.el.querySelectorAll('.product-list-item').forEach(product => this.productListItems.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__.default({\n el: product\n })));\n\n if (productItems.length) {\n if (window.Shopify && Shopify.PaymentButton) {\n Shopify.PaymentButton.init();\n }\n }\n });\n } // This method is only called inside of the theme editor\n // when the user changes product section settings\n\n\n _reloadRecommendations() {\n this._init();\n\n this._loadRecommendations();\n }\n\n onSectionUnload() {\n if (this.productMasonry) {\n this.productMasonry.onSectionUnload();\n }\n\n this.remove();\n this.productContainerEl.classList.remove(`product-recommendations-position-${this.positionedRight ? 'right' : 'section'}`);\n this.rightRecommendationContainer.innerHTML = '';\n this.sectionRecommendationContainer.innerHTML = '';\n window.removeEventListener('shopify:section:load', this._reloadRecommendations);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNQcm9kdWN0UmVjb21tZW5kYXRpb25zLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY1Byb2R1Y3RSZWNvbW1lbmRhdGlvbnMuanM/YWI4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5pbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCBQcm9kdWN0TGlzdEl0ZW0gZnJvbSAnLi4vY29tcG9uZW50cy9Qcm9kdWN0TGlzdEl0ZW0nO1xuaW1wb3J0IFByb2R1Y3RNYXNvbnJ5IGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdE1hc29ucnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNQcm9kdWN0UmVjb21tZW5kYXRpb25zIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuZGF0YSA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLl9pbml0KCk7XG4gICAgdGhpcy5yZWNvbW1lbmRVcmwgPSBgJHt3aW5kb3cuVGhlbWUucm91dGVzLnByb2R1Y3RfcmVjb21tZW5kYXRpb25zX3VybH0/c2VjdGlvbl9pZD0ke3NlY3Rpb24uaWR9JnByb2R1Y3RfaWQ9JHt0aGlzLnByb2R1Y3RJZH1gO1xuICAgIHRoaXMuX3JlbG9hZFJlY29tbWVuZGF0aW9ucyA9IHRoaXMuX3JlbG9hZFJlY29tbWVuZGF0aW9ucy5iaW5kKHRoaXMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246bG9hZCcsIHRoaXMuX3JlbG9hZFJlY29tbWVuZGF0aW9ucyk7XG4gICAgdGhpcy5fbG9hZFJlY29tbWVuZGF0aW9ucygpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMucHJvZHVjdExpc3RJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5yZW1vdmUoKSk7XG4gIH1cblxuICBfaW5pdCgpIHtcbiAgICB0aGlzLnByb2R1Y3RJZCA9IHRoaXMuZGF0YS5wcm9kdWN0SWQ7XG4gICAgdGhpcy5wb3NpdGlvbmVkUmlnaHQgPSB0aGlzLmRhdGEucG9zaXRpb25SaWdodDtcbiAgICB0aGlzLnByb2R1Y3RTZWN0aW9uRGF0YUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi10eXBlPVwicHJvZHVjdFwiXScpO1xuICAgIHRoaXMucHJvZHVjdFNlY3Rpb25Jc1ByZXNlbnQgPSAhIXRoaXMucHJvZHVjdFNlY3Rpb25EYXRhRWw7XG4gICAgbGV0IHByb2R1Y3RTZWN0aW9uRGF0YTtcblxuICAgIC8vIFRoZSBwcm9kdWN0IHNlY3Rpb24gY2FuIGJlIGhpZGRlbiBzbyB3ZSBkZWZhdWx0IHRvIHVzaW5nIHRoZSAnc3RhbmRhcmQnXG4gICAgLy8gcmVjb21tZW5kZWQgcHJvZHVjdHMgc2VjdGlvbiAodGhlIG9uZSB0aGF0J3Mgbm90IHJpZ2h0LWFsaWduZWQpLlxuICAgIGlmICh0aGlzLnByb2R1Y3RTZWN0aW9uSXNQcmVzZW50KSB7XG4gICAgICBwcm9kdWN0U2VjdGlvbkRhdGEgPSBKU09OLnBhcnNlKHRoaXMucHJvZHVjdFNlY3Rpb25EYXRhRWwuaW5uZXJIVE1MKTtcbiAgICAgIHRoaXMudXNlX21hc29ucnkgPSBwcm9kdWN0U2VjdGlvbkRhdGEuaW1hZ2VzX2xheW91dCA9PT0gJ21hc29ucnknO1xuXG4gICAgICBpZiAodGhpcy51c2VfbWFzb25yeSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uZWRSaWdodCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9kdWN0U2VjdGlvbkVsID0gdGhpcy5wcm9kdWN0U2VjdGlvbkRhdGFFbC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICB0aGlzLnByb2R1Y3RDb250YWluZXJFbCA9IHByb2R1Y3RTZWN0aW9uRWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtY29udGFpbmVyJyk7XG4gICAgICB0aGlzLnByb2R1Y3RDb250YWluZXJFbC5jbGFzc0xpc3QuYWRkKGBwcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1wb3NpdGlvbi0ke3RoaXMucG9zaXRpb25lZFJpZ2h0ID8gJ3JpZ2h0JyA6ICdzZWN0aW9uJ31gKTtcblxuICAgICAgdGhpcy5yaWdodFJlY29tbWVuZGF0aW9uQ29udGFpbmVyID0gcHJvZHVjdFNlY3Rpb25FbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1yaWdodF0nKTtcbiAgICAgIHRoaXMucmlnaHRSZWNvbW1lbmRhdGlvbkNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VfbWFzb25yeSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZV9tYXNvbnJ5IHx8ICF0aGlzLnByb2R1Y3RTZWN0aW9uSXNQcmVzZW50KSB7XG4gICAgICB0aGlzLnBvc2l0aW9uZWRSaWdodCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2VjdGlvblJlY29tbWVuZGF0aW9uQ29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1zZWN0aW9uXScpO1xuICB9XG5cbiAgX2xvYWRSZWNvbW1lbmRhdGlvbnMoKSB7XG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB0aGlzLnJlY29tbWVuZFVybCxcbiAgICAgIHsgdmlldzogJycgfSxcbiAgICApLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IGh0bWwgfSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKCFodG1sLmNvbW1vbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0ZW1wQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0ZW1wQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwuY29tbW9uO1xuICAgICAgY29uc3QgcHJvZHVjdHNXcmFwcGVyID0gdGVtcENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1yZWNvbW1lbmRhdGlvbnMnKTtcblxuICAgICAgaWYgKCF0aGlzLnBvc2l0aW9uZWRSaWdodCB8fCB0aGlzLnVzZV9tYXNvbnJ5KSB7XG4gICAgICAgIHByb2R1Y3RzV3JhcHBlci5pbm5lckhUTUwgPSBodG1sLmJlbG93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZHVjdHNXcmFwcGVyLmlubmVySFRNTCA9IGh0bWwucmlnaHQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnVzZV9tYXNvbnJ5KSB7XG4gICAgICAgIHByb2R1Y3RzV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdyb3ctb2YtNCcpO1xuICAgICAgICBwcm9kdWN0c1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgncm93LW9mLTMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSBleHRyYSBwcm9kdWN0cyBmb3Igbm9uLW1hc29ucnkgbGF5b3V0c1xuICAgICAgICBwcm9kdWN0c1dyYXBwZXJcbiAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbWFzb25yeS1vbmx5XScpXG4gICAgICAgICAgLmZvckVhY2gocHJvZHVjdCA9PiBwcm9kdWN0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJvZHVjdCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wb3NpdGlvbmVkUmlnaHQpIHtcbiAgICAgICAgdGhpcy5yaWdodFJlY29tbWVuZGF0aW9uQ29udGFpbmVyLmlubmVySFRNTCA9IHRlbXBDb250YWluZXIuaW5uZXJIVE1MO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gdGVtcENvbnRhaW5lci5pbm5lckhUTUw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnVzZV9tYXNvbnJ5KSB7XG4gICAgICAgIHRoaXMucHJvZHVjdE1hc29ucnkgPSBuZXcgUHJvZHVjdE1hc29ucnkoeyBlbDogdGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBwcm9kdWN0SXRlbXM7XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uZWRSaWdodCkge1xuICAgICAgICByaW1nLndhdGNoKHRoaXMucmlnaHRSZWNvbW1lbmRhdGlvbkNvbnRhaW5lcik7XG4gICAgICAgIHByb2R1Y3RJdGVtcyA9IHRoaXMucmlnaHRSZWNvbW1lbmRhdGlvbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1saXN0LWl0ZW0nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJpbWcud2F0Y2godGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIpO1xuICAgICAgICBwcm9kdWN0SXRlbXMgPSB0aGlzLnNlY3Rpb25SZWNvbW1lbmRhdGlvbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1saXN0LWl0ZW0nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zID0gW107XG4gICAgICB0aGlzLmVsXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1saXN0LWl0ZW0nKVxuICAgICAgICAuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMucHJvZHVjdExpc3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdCB9KSkpO1xuXG4gICAgICBpZiAocHJvZHVjdEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICBpZiAod2luZG93LlNob3BpZnkgJiYgU2hvcGlmeS5QYXltZW50QnV0dG9uKSB7XG4gICAgICAgICAgU2hvcGlmeS5QYXltZW50QnV0dG9uLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgaW5zaWRlIG9mIHRoZSB0aGVtZSBlZGl0b3JcbiAgLy8gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHByb2R1Y3Qgc2VjdGlvbiBzZXR0aW5nc1xuICBfcmVsb2FkUmVjb21tZW5kYXRpb25zKCkge1xuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9sb2FkUmVjb21tZW5kYXRpb25zKCk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnkpIHtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnkub25TZWN0aW9uVW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnByb2R1Y3RDb250YWluZXJFbC5jbGFzc0xpc3QucmVtb3ZlKGBwcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1wb3NpdGlvbi0ke3RoaXMucG9zaXRpb25lZFJpZ2h0ID8gJ3JpZ2h0JyA6ICdzZWN0aW9uJ31gKTtcbiAgICB0aGlzLnJpZ2h0UmVjb21tZW5kYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgdGhpcy5fcmVsb2FkUmVjb21tZW5kYXRpb25zKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticProductRecommendations.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/sections/StaticSearch.js":
+/*!*************************************************!*\
+ !*** ./source/scripts/sections/StaticSearch.js ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StaticSearch)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n/* harmony import */ var _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/FacetedFilters */ \"./source/scripts/components/FacetedFilters.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n\n\n\nclass StaticSearch {\n constructor(section) {\n this.el = section.el;\n this.facetedFilters = new _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_1__.default(section);\n this.masonry = this.el.querySelector('[data-masonry-grid]');\n this.masonryGrid = null;\n this.productListItems = [];\n this.el.querySelectorAll('.product-list-item').forEach(product => this.productListItems.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__.default({\n el: product\n })));\n\n if (this.masonry) {\n this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n el: this.masonry,\n settings: {\n itemSelector: '.product-list-item',\n horizontalOrder: true\n }\n });\n }\n }\n\n remove() {\n if (this.masonryGrid) {\n this.masonryGrid.unload();\n }\n\n this.productListItems.forEach(item => item.remove());\n }\n\n onSectionUnload() {\n this.remove();\n this.facetedFilters.unload();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNTZWFyY2guanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljU2VhcmNoLmpzPzRlNjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hc29ucnlHcmlkIGZyb20gJy4uL2NvbXBvbmVudHMvTWFzb25yeUdyaWQnO1xuaW1wb3J0IEZhY2V0ZWRGaWx0ZXJzIGZyb20gJy4uL2NvbXBvbmVudHMvRmFjZXRlZEZpbHRlcnMnO1xuaW1wb3J0IFByb2R1Y3RMaXN0SXRlbSBmcm9tICcuLi9jb21wb25lbnRzL1Byb2R1Y3RMaXN0SXRlbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY1NlYXJjaCB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmZhY2V0ZWRGaWx0ZXJzID0gbmV3IEZhY2V0ZWRGaWx0ZXJzKHNlY3Rpb24pO1xuICAgIHRoaXMubWFzb25yeSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS1ncmlkXScpO1xuICAgIHRoaXMubWFzb25yeUdyaWQgPSBudWxsO1xuXG4gICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zID0gW107XG4gICAgdGhpcy5lbFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LWxpc3QtaXRlbScpXG4gICAgICAuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMucHJvZHVjdExpc3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdCB9KSkpO1xuXG4gICAgaWYgKHRoaXMubWFzb25yeSkge1xuICAgICAgdGhpcy5tYXNvbnJ5R3JpZCA9IG5ldyBNYXNvbnJ5R3JpZCh7XG4gICAgICAgIGVsOiB0aGlzLm1hc29ucnksXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgaXRlbVNlbGVjdG9yOiAnLnByb2R1Y3QtbGlzdC1pdGVtJyxcbiAgICAgICAgICBob3Jpem9udGFsT3JkZXI6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMubWFzb25yeUdyaWQpIHtcbiAgICAgIHRoaXMubWFzb25yeUdyaWQudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLnJlbW92ZSgpKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMuZmFjZXRlZEZpbHRlcnMudW5sb2FkKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticSearch.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/templates/TemplateAccount.js":
+/*!*****************************************************!*\
+ !*** ./source/scripts/templates/TemplateAccount.js ***!
+ \*****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TemplateAccount)\n/* harmony export */ });\nclass TemplateAccount {\n constructor({\n el\n }) {\n this.el = el;\n const deleteAddressEls = this.el.querySelectorAll('.delete-address');\n const editAddressEls = this.el.querySelectorAll('.edit-address');\n const addNewAddressEl = this.el.querySelector('.add-new-address');\n const toggleForgetfulnessEl = this.el.querySelector('.toggle-forgetfulness');\n const addressCountryEl = this.el.querySelector('.address-country');\n\n if (deleteAddressEls.length) {\n deleteAddressEls.forEach(deleteAddressEl => deleteAddressEl.addEventListener('click', event => this.deleteAddress(event)));\n }\n\n if (editAddressEls.length) {\n editAddressEls.forEach(editAddressEl => editAddressEl.addEventListener('click', event => this.editAddress(event)));\n }\n\n if (addNewAddressEl) {\n addNewAddressEl.addEventListener('click', () => this.addNewAddress());\n }\n\n if (toggleForgetfulnessEl) {\n toggleForgetfulnessEl.addEventListener('click', () => this.recoverPassword());\n }\n\n if (addressCountryEl) {\n addressCountryEl.addEventListener('change', () => this.updateProvinceSelectText());\n }\n\n if (this.el.classList.contains('template-addresses')) {\n this.prepareAddresses();\n }\n\n if (this.el.classList.contains('template-login')) {\n this.checkForReset();\n }\n\n if (window.location.hash === '#recover') {\n return this.recoverPassword();\n }\n }\n\n recoverPassword() {\n this.el.querySelector('.recover-password').classList.toggle('visible');\n this.el.querySelector('.customer-login').classList.toggle('visible');\n }\n\n checkForReset() {\n if ('sucessfulReset' in this.el.querySelector('.reset-check').dataset) {\n this.el.querySelector('.successful-reset').classList.add('visible');\n }\n }\n\n prepareAddresses() {\n new Shopify.CountryProvinceSelector('address-country', 'address-province', {\n hideElement: 'address-province-container'\n });\n const addresses = this.el.querySelectorAll('.customer-address');\n addresses.forEach(address => {\n const addressID = address.dataset.addressId;\n new Shopify.CountryProvinceSelector(`address-country-${addressID}`, `address-province-${addressID}`, {\n hideElement: `address-province-container-${addressID}`\n });\n });\n }\n\n deleteAddress(e) {\n const addressID = e.target.closest('[data-address-id]').dataset.addressId;\n Shopify.CustomerAddress.destroy(addressID);\n }\n\n editAddress(e) {\n const addressID = e.target.closest('[data-address-id]').dataset.addressId;\n this.el.querySelector('.customer-address').classList.remove('editing');\n this.el.querySelector('.customer-address').querySelector('.edit-address').classList.remove('disabled');\n this.el.querySelector(`.customer-address[data-address-id='${addressID}']`).classList.add('editing');\n this.el.querySelector(`.customer-address[data-address-id='${addressID}']`).querySelector('.edit-address').classList.add('disabled');\n this.el.querySelector('.customer-address-edit-form, .customer-new-address').classList.add('hidden');\n this.el.querySelector(`.customer-address-edit-form[data-address-id='${addressID}']`).classList.remove('hidden');\n }\n\n addNewAddress() {\n this.el.querySelector('.customer-address').classList.remove('editing');\n this.el.querySelector('.customer-address').querySelector('.edit-address').classList.remove('disabled');\n this.el.querySelector('.customer-address-edit-form').classList.add('hidden');\n this.el.querySelector('.customer-new-address').classList.remove('hidden');\n }\n\n updateProvinceSelectText() {\n this.el.querySelector('.address-province').previousElementSibling.innerText = `-- ${window.Theme.pleaseSelectText} --`;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVBY2NvdW50LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3RlbXBsYXRlcy9UZW1wbGF0ZUFjY291bnQuanM/NzRkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBUZW1wbGF0ZUFjY291bnQge1xuICBjb25zdHJ1Y3Rvcih7IGVsIH0pIHtcbiAgICB0aGlzLmVsID0gZWw7XG5cbiAgICBjb25zdCBkZWxldGVBZGRyZXNzRWxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVsZXRlLWFkZHJlc3MnKTtcbiAgICBjb25zdCBlZGl0QWRkcmVzc0VscyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmVkaXQtYWRkcmVzcycpO1xuICAgIGNvbnN0IGFkZE5ld0FkZHJlc3NFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmFkZC1uZXctYWRkcmVzcycpO1xuICAgIGNvbnN0IHRvZ2dsZUZvcmdldGZ1bG5lc3NFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnRvZ2dsZS1mb3JnZXRmdWxuZXNzJyk7XG4gICAgY29uc3QgYWRkcmVzc0NvdW50cnlFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmFkZHJlc3MtY291bnRyeScpO1xuXG4gICAgaWYgKGRlbGV0ZUFkZHJlc3NFbHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGVBZGRyZXNzRWxzLmZvckVhY2goZGVsZXRlQWRkcmVzc0VsID0+IGRlbGV0ZUFkZHJlc3NFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuZGVsZXRlQWRkcmVzcyhldmVudCkpKTtcbiAgICB9XG5cbiAgICBpZiAoZWRpdEFkZHJlc3NFbHMubGVuZ3RoKSB7XG4gICAgICBlZGl0QWRkcmVzc0Vscy5mb3JFYWNoKGVkaXRBZGRyZXNzRWwgPT4gZWRpdEFkZHJlc3NFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuZWRpdEFkZHJlc3MoZXZlbnQpKSk7XG4gICAgfVxuXG4gICAgaWYgKGFkZE5ld0FkZHJlc3NFbCkge1xuICAgICAgYWRkTmV3QWRkcmVzc0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hZGROZXdBZGRyZXNzKCkpO1xuICAgIH1cblxuICAgIGlmICh0b2dnbGVGb3JnZXRmdWxuZXNzRWwpIHtcbiAgICAgIHRvZ2dsZUZvcmdldGZ1bG5lc3NFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMucmVjb3ZlclBhc3N3b3JkKCkpO1xuICAgIH1cblxuICAgIGlmIChhZGRyZXNzQ291bnRyeUVsKSB7XG4gICAgICBhZGRyZXNzQ291bnRyeUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHRoaXMudXBkYXRlUHJvdmluY2VTZWxlY3RUZXh0KCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVsLmNsYXNzTGlzdC5jb250YWlucygndGVtcGxhdGUtYWRkcmVzc2VzJykpIHsgdGhpcy5wcmVwYXJlQWRkcmVzc2VzKCk7IH1cbiAgICBpZiAodGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoJ3RlbXBsYXRlLWxvZ2luJykpIHsgdGhpcy5jaGVja0ZvclJlc2V0KCk7IH1cbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT09ICcjcmVjb3ZlcicpIHsgcmV0dXJuIHRoaXMucmVjb3ZlclBhc3N3b3JkKCk7IH1cbiAgfVxuXG4gIHJlY292ZXJQYXNzd29yZCgpIHtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5yZWNvdmVyLXBhc3N3b3JkJykuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpO1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmN1c3RvbWVyLWxvZ2luJykuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpO1xuICB9XG5cbiAgY2hlY2tGb3JSZXNldCgpIHtcbiAgICBpZiAoJ3N1Y2Vzc2Z1bFJlc2V0JyBpbiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5yZXNldC1jaGVjaycpLmRhdGFzZXQpIHtcbiAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnN1Y2Nlc3NmdWwtcmVzZXQnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZUFkZHJlc3NlcygpIHtcbiAgICBuZXcgU2hvcGlmeS5Db3VudHJ5UHJvdmluY2VTZWxlY3RvcignYWRkcmVzcy1jb3VudHJ5JywgJ2FkZHJlc3MtcHJvdmluY2UnLCB7XG4gICAgICBoaWRlRWxlbWVudDogJ2FkZHJlc3MtcHJvdmluY2UtY29udGFpbmVyJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkZHJlc3NlcyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmN1c3RvbWVyLWFkZHJlc3MnKTtcblxuICAgIGFkZHJlc3Nlcy5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc0lEID0gYWRkcmVzcy5kYXRhc2V0LmFkZHJlc3NJZDtcblxuICAgICAgbmV3IFNob3BpZnkuQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IoYGFkZHJlc3MtY291bnRyeS0ke2FkZHJlc3NJRH1gLCBgYWRkcmVzcy1wcm92aW5jZS0ke2FkZHJlc3NJRH1gLCB7XG4gICAgICAgIGhpZGVFbGVtZW50OiBgYWRkcmVzcy1wcm92aW5jZS1jb250YWluZXItJHthZGRyZXNzSUR9YCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlQWRkcmVzcyhlKSB7XG4gICAgY29uc3QgYWRkcmVzc0lEID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtYWRkcmVzcy1pZF0nKS5kYXRhc2V0LmFkZHJlc3NJZDtcblxuICAgIFNob3BpZnkuQ3VzdG9tZXJBZGRyZXNzLmRlc3Ryb3koYWRkcmVzc0lEKTtcbiAgfVxuXG4gIGVkaXRBZGRyZXNzKGUpIHtcbiAgICBjb25zdCBhZGRyZXNzSUQgPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1hZGRyZXNzLWlkXScpLmRhdGFzZXQuYWRkcmVzc0lkO1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tZXItYWRkcmVzcycpLmNsYXNzTGlzdC5yZW1vdmUoJ2VkaXRpbmcnKTtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21lci1hZGRyZXNzJykucXVlcnlTZWxlY3RvcignLmVkaXQtYWRkcmVzcycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoYC5jdXN0b21lci1hZGRyZXNzW2RhdGEtYWRkcmVzcy1pZD0nJHthZGRyZXNzSUR9J11gKS5jbGFzc0xpc3QuYWRkKCdlZGl0aW5nJyk7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGAuY3VzdG9tZXItYWRkcmVzc1tkYXRhLWFkZHJlc3MtaWQ9JyR7YWRkcmVzc0lEfSddYCkucXVlcnlTZWxlY3RvcignLmVkaXQtYWRkcmVzcycpLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21lci1hZGRyZXNzLWVkaXQtZm9ybSwgLmN1c3RvbWVyLW5ldy1hZGRyZXNzJykuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoYC5jdXN0b21lci1hZGRyZXNzLWVkaXQtZm9ybVtkYXRhLWFkZHJlc3MtaWQ9JyR7YWRkcmVzc0lEfSddYCkuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIH1cblxuICBhZGROZXdBZGRyZXNzKCkge1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmN1c3RvbWVyLWFkZHJlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdlZGl0aW5nJyk7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tZXItYWRkcmVzcycpLnF1ZXJ5U2VsZWN0b3IoJy5lZGl0LWFkZHJlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xuXG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21lci1hZGRyZXNzLWVkaXQtZm9ybScpLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmN1c3RvbWVyLW5ldy1hZGRyZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIH1cblxuICB1cGRhdGVQcm92aW5jZVNlbGVjdFRleHQoKSB7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYWRkcmVzcy1wcm92aW5jZScpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaW5uZXJUZXh0ID0gYC0tICR7d2luZG93LlRoZW1lLnBsZWFzZVNlbGVjdFRleHR9IC0tYDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5RkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/templates/TemplateAccount.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/templates/TemplateGiftCard.js":
+/*!******************************************************!*\
+ !*** ./source/scripts/templates/TemplateGiftCard.js ***!
+ \******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TemplateGiftCard)\n/* harmony export */ });\nclass TemplateGiftCard {\n constructor() {\n return this.addQrCode();\n }\n\n addQrCode() {\n const qrWrapper = document.querySelector('[data-qr-code]');\n return new QRCode(qrWrapper, {\n text: qrWrapper.dataset.qrCode,\n width: 120,\n height: 120\n });\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVHaWZ0Q2FyZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVHaWZ0Q2FyZC5qcz80NDExIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbXBsYXRlR2lmdENhcmQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRRckNvZGUoKTtcbiAgfVxuXG4gIGFkZFFyQ29kZSgpIHtcbiAgICBjb25zdCBxcldyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xci1jb2RlXScpO1xuXG4gICAgcmV0dXJuIG5ldyBRUkNvZGUocXJXcmFwcGVyLCB7XG4gICAgICB0ZXh0OiBxcldyYXBwZXIuZGF0YXNldC5xckNvZGUsXG4gICAgICB3aWR0aDogMTIwLFxuICAgICAgaGVpZ2h0OiAxMjAsXG4gICAgfSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFkQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/templates/TemplateGiftCard.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/templates/TemplateLogin.js":
+/*!***************************************************!*\
+ !*** ./source/scripts/templates/TemplateLogin.js ***!
+ \***************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TemplateLogin)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n\nclass TemplateLogin {\n constructor() {\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.adminLogin = document.querySelector('.admin-login-modal');\n this.events.register(this.adminLogin, 'click', () => this.openModal());\n this.events.register(document.body, 'click', event => this.closeModal(event));\n this.modalWrapper = document.querySelector('.password-page-modal-wrapper');\n\n if (this.modalWrapper) {\n this.modalContent = this.modalWrapper.querySelector('.password-page-modal');\n this.modalInput = this.modalWrapper.querySelector('.password-page-input');\n\n if (this.modalWrapper.querySelector('[data-open-modal]')) {\n this.openModal();\n }\n }\n\n this.events.register(window, 'resize', () => this.positionModal());\n }\n\n closeModal(e) {\n if (e.target.classList.contains('visible')) {\n this.modalWrapper.classList.remove('visible');\n this.events.register(this.modalWrapper, 'transitionend', () => {\n document.body.classList.remove('scroll-locked');\n });\n }\n }\n\n openModal() {\n document.body.classList.add('scroll-locked');\n this.positionModal();\n this.modalWrapper.classList.add('visible');\n this.events.register(this.modalWrapper, 'transitionend', () => {\n this.modalInput.focus();\n });\n }\n\n positionModal() {\n const {\n width,\n height\n } = this.modalContent.getBoundingClientRect();\n this.modalContent.style.marginTop = -(height / 2);\n this.modalContent.style.marginLeft = -(width / 2);\n }\n\n unload() {\n if (this.events) {\n this.events.unregisterAll();\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVMb2dpbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVMb2dpbi5qcz80MmU1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVMb2dpbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMuYWRtaW5Mb2dpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hZG1pbi1sb2dpbi1tb2RhbCcpO1xuXG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5hZG1pbkxvZ2luLCAnY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5Nb2RhbCgpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihkb2N1bWVudC5ib2R5LCAnY2xpY2snLCBldmVudCA9PiB0aGlzLmNsb3NlTW9kYWwoZXZlbnQpKTtcblxuICAgIHRoaXMubW9kYWxXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhc3N3b3JkLXBhZ2UtbW9kYWwtd3JhcHBlcicpO1xuXG4gICAgaWYgKHRoaXMubW9kYWxXcmFwcGVyKSB7XG4gICAgICB0aGlzLm1vZGFsQ29udGVudCA9IHRoaXMubW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5wYXNzd29yZC1wYWdlLW1vZGFsJyk7XG4gICAgICB0aGlzLm1vZGFsSW5wdXQgPSB0aGlzLm1vZGFsV3JhcHBlci5xdWVyeVNlbGVjdG9yKCcucGFzc3dvcmQtcGFnZS1pbnB1dCcpO1xuICAgICAgaWYgKHRoaXMubW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9wZW4tbW9kYWxdJykpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB0aGlzLnBvc2l0aW9uTW9kYWwoKSk7XG4gIH1cblxuICBjbG9zZU1vZGFsKGUpIHtcbiAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2aXNpYmxlJykpIHtcbiAgICAgIHRoaXMubW9kYWxXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMubW9kYWxXcmFwcGVyLCAndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvcGVuTW9kYWwoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgdGhpcy5wb3NpdGlvbk1vZGFsKCk7XG4gICAgdGhpcy5tb2RhbFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMubW9kYWxXcmFwcGVyLCAndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIHRoaXMubW9kYWxJbnB1dC5mb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcG9zaXRpb25Nb2RhbCgpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMubW9kYWxDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMubW9kYWxDb250ZW50LnN0eWxlLm1hcmdpblRvcCA9IC0oaGVpZ2h0IC8gMik7XG4gICAgdGhpcy5tb2RhbENvbnRlbnQuc3R5bGUubWFyZ2luTGVmdCA9IC0od2lkdGggLyAyKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBpZiAodGhpcy5ldmVudHMpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/templates/TemplateLogin.js\n");
+
+/***/ }),
+
+/***/ "./source/scripts/themeUtils.js":
+/*!**************************************!*\
+ !*** ./source/scripts/themeUtils.js ***!
+ \**************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nlet themeUtils;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (themeUtils = {\n breakpoints: {\n small: 770,\n medium: 1080,\n large: 1280\n },\n\n extend(dest, ...objs) {\n for (let i = 0; i < objs.length; i++) {\n const obj = objs[i];\n\n for (let k in obj) {\n const v = obj[k];\n dest[k] = v;\n }\n }\n\n return dest;\n },\n\n windowWidth() {\n return window.innerWidth;\n },\n\n isLessThanMedium() {\n return this.windowWidth() < this.breakpoints.small;\n },\n\n isLessThanLarge() {\n return this.windowWidth() < this.breakpoints.medium;\n },\n\n isSmall() {\n return this.windowWidth() < this.breakpoints.small;\n },\n\n isMedium() {\n return this.windowWidth() >= this.breakpoints.small && this.windowWidth() < this.breakpoints.medium;\n },\n\n isLarge() {\n return this.windowWidth() >= this.breakpoints.medium;\n },\n\n debounce(func, wait, immediate) {\n let timeout = null;\n return function () {\n const context = this;\n const args = arguments;\n\n const later = function () {\n timeout = null;\n\n if (!immediate) {\n func.apply(context, args);\n }\n };\n\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n\n if (callNow) {\n func.apply(context, args);\n }\n };\n },\n\n unique(array) {\n let key;\n let asc;\n let end;\n const output = {};\n\n for (key = 0, end = array.length, asc = end >= 0; asc ? key < end : key > end; asc ? key++ : key--) {\n output[array[key]] = array[key];\n }\n\n return (() => {\n const result = [];\n\n for (key in output) {\n const value = output[key];\n result.push(value);\n }\n\n return result;\n })();\n },\n\n inViewport(el, direction) {\n let viewportHeight;\n let viewportWidth;\n\n if (direction == null) {\n direction = 'both';\n }\n\n const rect = el.getBoundingClientRect();\n const style = el.currentStyle || window.getComputedStyle(el);\n const marginRight = parseInt(style.marginRight) || 0;\n const marginLeft = parseInt(style.marginLeft) || 0;\n\n if (document.documentElement.clientWidth < window.innerWidth) {\n viewportWidth = document.documentElement.clientWidth;\n } else {\n viewportWidth = window.innerWidth;\n }\n\n if (document.documentElement.clientHeight < window.innerHeight) {\n viewportHeight = document.documentElement.clientHeight;\n } else {\n viewportHeight = window.innerHeight;\n }\n\n const inViewportH = rect.right - marginRight >= 0 && rect.left - marginLeft <= viewportWidth;\n const inViewportV = rect.bottom >= 0 && rect.top <= viewportHeight;\n\n switch (direction) {\n case 'horizontal':\n return inViewportH;\n\n case 'vertical':\n return inViewportV;\n\n case 'both':\n return inViewportV && inViewportH;\n }\n },\n\n /*\n Resize Flickity slider to tallest cell in viewport\n */\n flickityResize(flickity) {\n if (!flickity) return;\n const {\n viewport\n } = flickity;\n const heights = [];\n\n for (let i = 0; i < flickity.cells.length; i++) {\n const cell = flickity.cells[i];\n\n if (this.inViewport(cell.element, 'horizontal')) {\n const style = window.getComputedStyle(cell.element); // Combine the top and bottom margins since these values are not\n // included in getBoundingClientRect.height();\n\n const {\n marginTop,\n marginBottom\n } = style;\n const topMargin = parseInt(marginTop, 10);\n const bottomMargin = parseInt(marginBottom, 10);\n const height = topMargin + bottomMargin + cell.element.getBoundingClientRect().height;\n heights.push(height);\n }\n }\n\n const height = Math.max.apply(null, heights);\n viewport.style.height = `${height}px`;\n }\n\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90aGVtZVV0aWxzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3RoZW1lVXRpbHMuanM/NGRiMCJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgdGhlbWVVdGlscztcblxuZXhwb3J0IGRlZmF1bHQgdGhlbWVVdGlscyA9IHtcbiAgYnJlYWtwb2ludHM6IHtcbiAgICBzbWFsbDogNzcwLFxuICAgIG1lZGl1bTogMTA4MCxcbiAgICBsYXJnZTogMTI4MFxuICB9LFxuXG4gIGV4dGVuZChkZXN0LCAuLi5vYmpzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvYmogPSBvYmpzW2ldO1xuICAgICAgZm9yIChsZXQgayBpbiBvYmopIHsgY29uc3QgdiA9IG9ialtrXTsgZGVzdFtrXSA9IHY7IH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH0sXG5cbiAgd2luZG93V2lkdGgoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoO1xuICB9LFxuXG4gIGlzTGVzc1RoYW5NZWRpdW0oKSB7XG4gICAgcmV0dXJuIHRoaXMud2luZG93V2lkdGgoKSA8IHRoaXMuYnJlYWtwb2ludHMuc21hbGw7XG4gIH0sXG5cbiAgaXNMZXNzVGhhbkxhcmdlKCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd1dpZHRoKCkgPCB0aGlzLmJyZWFrcG9pbnRzLm1lZGl1bTtcbiAgfSxcblxuICBpc1NtYWxsKCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd1dpZHRoKCkgPCB0aGlzLmJyZWFrcG9pbnRzLnNtYWxsO1xuICB9LFxuXG4gIGlzTWVkaXVtKCkge1xuICAgIHJldHVybiAodGhpcy53aW5kb3dXaWR0aCgpID49IHRoaXMuYnJlYWtwb2ludHMuc21hbGwpXG4gICAgICAmJiAodGhpcy53aW5kb3dXaWR0aCgpIDwgdGhpcy5icmVha3BvaW50cy5tZWRpdW0pO1xuICB9LFxuXG4gIGlzTGFyZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMud2luZG93V2lkdGgoKSA+PSB0aGlzLmJyZWFrcG9pbnRzLm1lZGl1bTtcbiAgfSxcblxuICBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICBsZXQgdGltZW91dCA9IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG4gICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuXG4gICAgICBpZiAoY2FsbE5vdykge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgdW5pcXVlKGFycmF5KSB7XG4gICAgbGV0IGtleTtcbiAgICBsZXQgYXNjO1xuICAgIGxldCBlbmQ7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChrZXkgPSAwLCBlbmQgPSBhcnJheS5sZW5ndGgsIGFzYyA9IChlbmQgPj0gMCk7XG4gICAgICBhc2MgPyBrZXkgPCBlbmQgOiBrZXkgPiBlbmQ7XG4gICAgICBhc2MgPyBrZXkrKyA6IGtleS0tKSB7XG4gICAgICBvdXRwdXRbYXJyYXlba2V5XV0gPSBhcnJheVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChrZXkgaW4gb3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3V0cHV0W2tleV07XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkoKTtcbiAgfSxcblxuICBpblZpZXdwb3J0KGVsLCBkaXJlY3Rpb24pIHtcbiAgICBsZXQgdmlld3BvcnRIZWlnaHQ7XG4gICAgbGV0IHZpZXdwb3J0V2lkdGg7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKSB7IGRpcmVjdGlvbiA9ICdib3RoJzsgfVxuXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHN0eWxlID0gZWwuY3VycmVudFN0eWxlIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICBjb25zdCBtYXJnaW5SaWdodCA9IHBhcnNlSW50KHN0eWxlLm1hcmdpblJpZ2h0KSB8fCAwO1xuICAgIGNvbnN0IG1hcmdpbkxlZnQgPSBwYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0KSB8fCAwO1xuXG4gICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICB2aWV3cG9ydFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3QgaW5WaWV3cG9ydEggPSAoKHJlY3QucmlnaHQgLSBtYXJnaW5SaWdodCkgPj0gMClcbiAgICAgICYmICgocmVjdC5sZWZ0IC0gbWFyZ2luTGVmdCkgPD0gdmlld3BvcnRXaWR0aCk7XG4gICAgY29uc3QgaW5WaWV3cG9ydFYgPSAocmVjdC5ib3R0b20gPj0gMCkgJiYgKHJlY3QudG9wIDw9IHZpZXdwb3J0SGVpZ2h0KTtcblxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzogcmV0dXJuIGluVmlld3BvcnRIO1xuICAgICAgY2FzZSAndmVydGljYWwnOiByZXR1cm4gaW5WaWV3cG9ydFY7XG4gICAgICBjYXNlICdib3RoJzogcmV0dXJuIGluVmlld3BvcnRWICYmIGluVmlld3BvcnRIO1xuICAgIH1cbiAgfSxcblxuICAvKlxuICAgICAgICBSZXNpemUgRmxpY2tpdHkgc2xpZGVyIHRvIHRhbGxlc3QgY2VsbCBpbiB2aWV3cG9ydFxuICAgICAgICAqL1xuICBmbGlja2l0eVJlc2l6ZShmbGlja2l0eSkge1xuICAgIGlmICghZmxpY2tpdHkpIHJldHVybjtcbiAgICBjb25zdCB7IHZpZXdwb3J0IH0gPSBmbGlja2l0eTtcbiAgICBjb25zdCBoZWlnaHRzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsaWNraXR5LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjZWxsID0gZmxpY2tpdHkuY2VsbHNbaV07XG4gICAgICBpZiAodGhpcy5pblZpZXdwb3J0KGNlbGwuZWxlbWVudCwgJ2hvcml6b250YWwnKSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwuZWxlbWVudCk7XG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgc2luY2UgdGhlc2UgdmFsdWVzIGFyZSBub3RcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmhlaWdodCgpO1xuICAgICAgICBjb25zdCB7IG1hcmdpblRvcCwgbWFyZ2luQm90dG9tIH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgdG9wTWFyZ2luID0gcGFyc2VJbnQobWFyZ2luVG9wLCAxMCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbU1hcmdpbiA9IHBhcnNlSW50KG1hcmdpbkJvdHRvbSwgMTApO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW4gKyBjZWxsLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGhlaWdodHMucHVzaChoZWlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuXG4gICAgdmlld3BvcnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgfSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQS9JQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/themeUtils.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/desandro-matches-selector/matches-selector.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/desandro-matches-selector/matches-selector.js ***!
+ \********************************************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9kZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yL21hdGNoZXMtc2VsZWN0b3IuanM/Yzc0NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1hdGNoZXNTZWxlY3RvciB2Mi4wLjJcbiAqIG1hdGNoZXNTZWxlY3RvciggZWxlbWVudCwgJy5zZWxlY3RvcicgKVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvKmdsb2JhbCBkZWZpbmU6IGZhbHNlLCBtb2R1bGU6IGZhbHNlICovXG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5tYXRjaGVzU2VsZWN0b3IgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1hdGNoZXNNZXRob2QgPSAoIGZ1bmN0aW9uKCkge1xuICAgIHZhciBFbGVtUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gICAgLy8gY2hlY2sgZm9yIHRoZSBzdGFuZGFyZCBtZXRob2QgbmFtZSBmaXJzdFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXMgKSB7XG4gICAgICByZXR1cm4gJ21hdGNoZXMnO1xuICAgIH1cbiAgICAvLyBjaGVjayB1bi1wcmVmaXhlZFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXNTZWxlY3RvciApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlc1NlbGVjdG9yJztcbiAgICB9XG4gICAgLy8gY2hlY2sgdmVuZG9yIHByZWZpeGVzXG4gICAgdmFyIHByZWZpeGVzID0gWyAnd2Via2l0JywgJ21veicsICdtcycsICdvJyBdO1xuXG4gICAgZm9yICggdmFyIGk9MDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgICAgdmFyIG1ldGhvZCA9IHByZWZpeCArICdNYXRjaGVzU2VsZWN0b3InO1xuICAgICAgaWYgKCBFbGVtUHJvdG9bIG1ldGhvZCBdICkge1xuICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gZWxlbVsgbWF0Y2hlc01ldGhvZCBdKCBzZWxlY3RvciApO1xuICB9O1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/desandro-matches-selector/matches-selector.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/ev-emitter/ev-emitter.js":
+/*!***********************************************!*\
+ !*** ./node_modules/ev-emitter/ev-emitter.js ***!
+ \***********************************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZXYtZW1pdHRlci9ldi1lbWl0dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9ldi1lbWl0dGVyL2V2LWVtaXR0ZXIuanM/MDk0OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV2RW1pdHRlciB2MS4xLjBcbiAqIExpbCcgZXZlbnQgZW1pdHRlclxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4vKiBqc2hpbnQgdW51c2VkOiB0cnVlLCB1bmRlZjogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHdpbmRvdyAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRCAtIFJlcXVpcmVKU1xuICAgIGRlZmluZSggZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgIGdsb2JhbC5FdkVtaXR0ZXIgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCkge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gRXZFbWl0dGVyKCkge31cblxudmFyIHByb3RvID0gRXZFbWl0dGVyLnByb3RvdHlwZTtcblxucHJvdG8ub24gPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgaWYgKCAhZXZlbnROYW1lIHx8ICFsaXN0ZW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2V0IGV2ZW50cyBoYXNoXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIC8vIHNldCBsaXN0ZW5lcnMgYXJyYXlcbiAgdmFyIGxpc3RlbmVycyA9IGV2ZW50c1sgZXZlbnROYW1lIF0gPSBldmVudHNbIGV2ZW50TmFtZSBdIHx8IFtdO1xuICAvLyBvbmx5IGFkZCBvbmNlXG4gIGlmICggbGlzdGVuZXJzLmluZGV4T2YoIGxpc3RlbmVyICkgPT0gLTEgKSB7XG4gICAgbGlzdGVuZXJzLnB1c2goIGxpc3RlbmVyICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLm9uY2UgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgaWYgKCAhZXZlbnROYW1lIHx8ICFsaXN0ZW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYWRkIGV2ZW50XG4gIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgLy8gc2V0IG9uY2UgZmxhZ1xuICAvLyBzZXQgb25jZUV2ZW50cyBoYXNoXG4gIHZhciBvbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyA9IHRoaXMuX29uY2VFdmVudHMgfHwge307XG4gIC8vIHNldCBvbmNlTGlzdGVuZXJzIG9iamVjdFxuICB2YXIgb25jZUxpc3RlbmVycyA9IG9uY2VFdmVudHNbIGV2ZW50TmFtZSBdID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gfHwge307XG4gIC8vIHNldCBmbGFnXG4gIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF0gPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub2ZmID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKTtcbiAgaWYgKCBpbmRleCAhPSAtMSApIHtcbiAgICBsaXN0ZW5lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5lbWl0RXZlbnQgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBhcmdzICkge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzICYmIHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF07XG4gIGlmICggIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gY29weSBvdmVyIHRvIGF2b2lkIGludGVyZmVyZW5jZSBpZiAub2ZmKCkgaW4gbGlzdGVuZXJcbiAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLnNsaWNlKDApO1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgLy8gb25jZSBzdHVmZlxuICB2YXIgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VFdmVudHMgJiYgdGhpcy5fb25jZUV2ZW50c1sgZXZlbnROYW1lIF07XG5cbiAgZm9yICggdmFyIGk9MDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV1cbiAgICB2YXIgaXNPbmNlID0gb25jZUxpc3RlbmVycyAmJiBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIGlmICggaXNPbmNlICkge1xuICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyXG4gICAgICAvLyByZW1vdmUgYmVmb3JlIHRyaWdnZXIgdG8gcHJldmVudCByZWN1cnNpb25cbiAgICAgIHRoaXMub2ZmKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gICAgICAvLyB1bnNldCBvbmNlIGZsYWdcbiAgICAgIGRlbGV0ZSBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIH1cbiAgICAvLyB0cmlnZ2VyIGxpc3RlbmVyXG4gICAgbGlzdGVuZXIuYXBwbHkoIHRoaXMsIGFyZ3MgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8uYWxsT2ZmID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHM7XG4gIGRlbGV0ZSB0aGlzLl9vbmNlRXZlbnRzO1xufTtcblxucmV0dXJuIEV2RW1pdHRlcjtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/ev-emitter/ev-emitter.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/fizzy-ui-utils/utils.js":
+/*!**********************************************!*\
+ !*** ./node_modules/fizzy-ui-utils/utils.js ***!
+ \**********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! desandro-matches-selector/matches-selector */ \"./node_modules/desandro-matches-selector/matches-selector.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( matchesSelector ) {\n return factory( window, matchesSelector );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZml6enktdWktdXRpbHMvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2Zpenp5LXVpLXV0aWxzL3V0aWxzLmpzPzYxNTgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXp6eSBVSSB1dGlscyB2Mi4wLjdcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qanNoaW50IHN0cmljdDogZmFsc2UgKi8gLypnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG5cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yL21hdGNoZXMtc2VsZWN0b3InXG4gICAgXSwgZnVuY3Rpb24oIG1hdGNoZXNTZWxlY3RvciApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIG1hdGNoZXNTZWxlY3RvciApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3RvcicpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5maXp6eVVJVXRpbHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93Lm1hdGNoZXNTZWxlY3RvclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIG1hdGNoZXNTZWxlY3RvciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSB7fTtcblxuLy8gLS0tLS0gZXh0ZW5kIC0tLS0tIC8vXG5cbi8vIGV4dGVuZHMgb2JqZWN0c1xudXRpbHMuZXh0ZW5kID0gZnVuY3Rpb24oIGEsIGIgKSB7XG4gIGZvciAoIHZhciBwcm9wIGluIGIgKSB7XG4gICAgYVsgcHJvcCBdID0gYlsgcHJvcCBdO1xuICB9XG4gIHJldHVybiBhO1xufTtcblxuLy8gLS0tLS0gbW9kdWxvIC0tLS0tIC8vXG5cbnV0aWxzLm1vZHVsbyA9IGZ1bmN0aW9uKCBudW0sIGRpdiApIHtcbiAgcmV0dXJuICggKCBudW0gJSBkaXYgKSArIGRpdiApICUgZGl2O1xufTtcblxuLy8gLS0tLS0gbWFrZUFycmF5IC0tLS0tIC8vXG5cbnZhciBhcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vLyB0dXJuIGVsZW1lbnQgb3Igbm9kZUxpc3QgaW50byBhbiBhcnJheVxudXRpbHMubWFrZUFycmF5ID0gZnVuY3Rpb24oIG9iaiApIHtcbiAgaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHtcbiAgICAvLyB1c2Ugb2JqZWN0IGlmIGFscmVhZHkgYW4gYXJyYXlcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIC8vIHJldHVybiBlbXB0eSBhcnJheSBpZiB1bmRlZmluZWQgb3IgbnVsbC4gIzZcbiAgaWYgKCBvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQgKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGlzQXJyYXlMaWtlID0gdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqLmxlbmd0aCA9PSAnbnVtYmVyJztcbiAgaWYgKCBpc0FycmF5TGlrZSApIHtcbiAgICAvLyBjb252ZXJ0IG5vZGVMaXN0IHRvIGFycmF5XG4gICAgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCggb2JqICk7XG4gIH1cblxuICAvLyBhcnJheSBvZiBzaW5nbGUgaW5kZXhcbiAgcmV0dXJuIFsgb2JqIF07XG59O1xuXG4vLyAtLS0tLSByZW1vdmVGcm9tIC0tLS0tIC8vXG5cbnV0aWxzLnJlbW92ZUZyb20gPSBmdW5jdGlvbiggYXJ5LCBvYmogKSB7XG4gIHZhciBpbmRleCA9IGFyeS5pbmRleE9mKCBvYmogKTtcbiAgaWYgKCBpbmRleCAhPSAtMSApIHtcbiAgICBhcnkuc3BsaWNlKCBpbmRleCwgMSApO1xuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRQYXJlbnQgLS0tLS0gLy9cblxudXRpbHMuZ2V0UGFyZW50ID0gZnVuY3Rpb24oIGVsZW0sIHNlbGVjdG9yICkge1xuICB3aGlsZSAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtICE9IGRvY3VtZW50LmJvZHkgKSB7XG4gICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTtcbiAgICBpZiAoIG1hdGNoZXNTZWxlY3RvciggZWxlbSwgc2VsZWN0b3IgKSApIHtcbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0gZ2V0UXVlcnlFbGVtZW50IC0tLS0tIC8vXG5cbi8vIHVzZSBlbGVtZW50IGFzIHNlbGVjdG9yIHN0cmluZ1xudXRpbHMuZ2V0UXVlcnlFbGVtZW50ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuICByZXR1cm4gZWxlbTtcbn07XG5cbi8vIC0tLS0tIGhhbmRsZUV2ZW50IC0tLS0tIC8vXG5cbi8vIGVuYWJsZSAub250eXBlIHRvIHRyaWdnZXIgZnJvbSAuYWRkRXZlbnRMaXN0ZW5lciggZWxlbSwgJ3R5cGUnIClcbnV0aWxzLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGZpbHRlckZpbmRFbGVtZW50cyAtLS0tLSAvL1xuXG51dGlscy5maWx0ZXJGaW5kRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMsIHNlbGVjdG9yICkge1xuICAvLyBtYWtlIGFycmF5IG9mIGVsZW1zXG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgZmZFbGVtcyA9IFtdO1xuXG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIC8vIGNoZWNrIHRoYXQgZWxlbSBpcyBhbiBhY3R1YWwgZWxlbWVudFxuICAgIGlmICggISggZWxlbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICkgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGFkZCBlbGVtIGlmIG5vIHNlbGVjdG9yXG4gICAgaWYgKCAhc2VsZWN0b3IgKSB7XG4gICAgICBmZkVsZW1zLnB1c2goIGVsZW0gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZmlsdGVyICYgZmluZCBpdGVtcyBpZiB3ZSBoYXZlIGEgc2VsZWN0b3JcbiAgICAvLyBmaWx0ZXJcbiAgICBpZiAoIG1hdGNoZXNTZWxlY3RvciggZWxlbSwgc2VsZWN0b3IgKSApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgIH1cbiAgICAvLyBmaW5kIGNoaWxkcmVuXG4gICAgdmFyIGNoaWxkRWxlbXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yICk7XG4gICAgLy8gY29uY2F0IGNoaWxkRWxlbXMgdG8gZmlsdGVyRm91bmQgYXJyYXlcbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgY2hpbGRFbGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggY2hpbGRFbGVtc1tpXSApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZmRWxlbXM7XG59O1xuXG4vLyAtLS0tLSBkZWJvdW5jZU1ldGhvZCAtLS0tLSAvL1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCA9IGZ1bmN0aW9uKCBfY2xhc3MsIG1ldGhvZE5hbWUsIHRocmVzaG9sZCApIHtcbiAgdGhyZXNob2xkID0gdGhyZXNob2xkIHx8IDEwMDtcbiAgLy8gb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBtZXRob2QgPSBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF07XG4gIHZhciB0aW1lb3V0TmFtZSA9IG1ldGhvZE5hbWUgKyAnVGltZW91dCc7XG5cbiAgX2NsYXNzLnByb3RvdHlwZVsgbWV0aG9kTmFtZSBdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRpbWVvdXQgPSB0aGlzWyB0aW1lb3V0TmFtZSBdO1xuICAgIGNsZWFyVGltZW91dCggdGltZW91dCApO1xuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB0aGlzWyB0aW1lb3V0TmFtZSBdID0gc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICBtZXRob2QuYXBwbHkoIF90aGlzLCBhcmdzICk7XG4gICAgICBkZWxldGUgX3RoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgfSwgdGhyZXNob2xkICk7XG4gIH07XG59O1xuXG4vLyAtLS0tLSBkb2NSZWFkeSAtLS0tLSAvL1xuXG51dGlscy5kb2NSZWFkeSA9IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcbiAgdmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlO1xuICBpZiAoIHJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyB8fCByZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScgKSB7XG4gICAgLy8gZG8gYXN5bmMgdG8gYWxsb3cgZm9yIG90aGVyIHNjcmlwdHMgdG8gcnVuLiBtZXRhZml6enkvZmxpY2tpdHkjNDQxXG4gICAgc2V0VGltZW91dCggY2FsbGJhY2sgKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGNhbGxiYWNrICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGh0bWxJbml0IC0tLS0tIC8vXG5cbi8vIGh0dHA6Ly9qYW1lc3JvYmVydHMubmFtZS9ibG9nLzIwMTAvMDIvMjIvc3RyaW5nLWZ1bmN0aW9ucy1mb3ItamF2YXNjcmlwdC10cmltLXRvLWNhbWVsLWNhc2UtdG8tZGFzaGVkLWFuZC10by11bmRlcnNjb3JlL1xudXRpbHMudG9EYXNoZWQgPSBmdW5jdGlvbiggc3RyICkge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoIC8oLikoW0EtWl0pL2csIGZ1bmN0aW9uKCBtYXRjaCwgJDEsICQyICkge1xuICAgIHJldHVybiAkMSArICctJyArICQyO1xuICB9KS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcbi8qKlxuICogYWxsb3cgdXNlciB0byBpbml0aWFsaXplIGNsYXNzZXMgdmlhIFtkYXRhLW5hbWVzcGFjZV0gb3IgLmpzLW5hbWVzcGFjZSBjbGFzc1xuICogaHRtbEluaXQoIFdpZGdldCwgJ3dpZGdldE5hbWUnIClcbiAqIG9wdGlvbnMgYXJlIHBhcnNlZCBmcm9tIGRhdGEtbmFtZXNwYWNlLW9wdGlvbnNcbiAqL1xudXRpbHMuaHRtbEluaXQgPSBmdW5jdGlvbiggV2lkZ2V0Q2xhc3MsIG5hbWVzcGFjZSApIHtcbiAgdXRpbHMuZG9jUmVhZHkoIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkYXNoZWROYW1lc3BhY2UgPSB1dGlscy50b0Rhc2hlZCggbmFtZXNwYWNlICk7XG4gICAgdmFyIGRhdGFBdHRyID0gJ2RhdGEtJyArIGRhc2hlZE5hbWVzcGFjZTtcbiAgICB2YXIgZGF0YUF0dHJFbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbJyArIGRhdGFBdHRyICsgJ10nICk7XG4gICAgdmFyIGpzRGFzaEVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5qcy0nICsgZGFzaGVkTmFtZXNwYWNlICk7XG4gICAgdmFyIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBkYXRhQXR0ckVsZW1zIClcbiAgICAgIC5jb25jYXQoIHV0aWxzLm1ha2VBcnJheSgganNEYXNoRWxlbXMgKSApO1xuICAgIHZhciBkYXRhT3B0aW9uc0F0dHIgPSBkYXRhQXR0ciArICctb3B0aW9ucyc7XG4gICAgdmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG5cbiAgICBlbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgIHZhciBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIGRhdGFBdHRyICkgfHxcbiAgICAgICAgZWxlbS5nZXRBdHRyaWJ1dGUoIGRhdGFPcHRpb25zQXR0ciApO1xuICAgICAgdmFyIG9wdGlvbnM7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpb25zID0gYXR0ciAmJiBKU09OLnBhcnNlKCBhdHRyICk7XG4gICAgICB9IGNhdGNoICggZXJyb3IgKSB7XG4gICAgICAgIC8vIGxvZyBlcnJvciwgZG8gbm90IGluaXRpYWxpemVcbiAgICAgICAgaWYgKCBjb25zb2xlICkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdFcnJvciBwYXJzaW5nICcgKyBkYXRhQXR0ciArICcgb24gJyArIGVsZW0uY2xhc3NOYW1lICtcbiAgICAgICAgICAnOiAnICsgZXJyb3IgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBpbml0aWFsaXplXG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgV2lkZ2V0Q2xhc3MoIGVsZW0sIG9wdGlvbnMgKTtcbiAgICAgIC8vIG1ha2UgYXZhaWxhYmxlIHZpYSAkKCkuZGF0YSgnbmFtZXNwYWNlJylcbiAgICAgIGlmICggalF1ZXJ5ICkge1xuICAgICAgICBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZXNwYWNlLCBpbnN0YW5jZSApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH0pO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiB1dGlscztcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFdBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/fizzy-ui-utils/utils.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/add-remove-cell.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/flickity/js/add-remove-cell.js ***!
+ \*****************************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// add, remove cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n });\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvYWRkLXJlbW92ZS1jZWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9hZGQtcmVtb3ZlLWNlbGwuanM/YmQ3YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhZGQsIHJlbW92ZSBjZWxsXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJ1xuICAgIF0sIGZ1bmN0aW9uKCBGbGlja2l0eSwgdXRpbHMgKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgdXRpbHMgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJy4vZmxpY2tpdHknKSxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gYXBwZW5kIGNlbGxzIHRvIGEgZG9jdW1lbnQgZnJhZ21lbnRcbmZ1bmN0aW9uIGdldENlbGxzRnJhZ21lbnQoIGNlbGxzICkge1xuICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKCBjZWxsLmVsZW1lbnQgKTtcbiAgfSk7XG4gIHJldHVybiBmcmFnbWVudDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWRkL3JlbW92ZSBjZWxsIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbi8qKlxuICogSW5zZXJ0LCBwcmVwZW5kLCBvciBhcHBlbmQgY2VsbHNcbiAqIEBwYXJhbSB7RWxlbWVudCwgQXJyYXksIE5vZGVMaXN0fSBlbGVtc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleFxuICovXG5wcm90by5pbnNlcnQgPSBmdW5jdGlvbiggZWxlbXMsIGluZGV4ICkge1xuICB2YXIgY2VsbHMgPSB0aGlzLl9tYWtlQ2VsbHMoIGVsZW1zICk7XG4gIGlmICggIWNlbGxzIHx8ICFjZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsZW4gPSB0aGlzLmNlbGxzLmxlbmd0aDtcbiAgLy8gZGVmYXVsdCB0byBhcHBlbmRcbiAgaW5kZXggPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gbGVuIDogaW5kZXg7XG4gIC8vIGFkZCBjZWxscyB3aXRoIGRvY3VtZW50IGZyYWdtZW50XG4gIHZhciBmcmFnbWVudCA9IGdldENlbGxzRnJhZ21lbnQoIGNlbGxzICk7XG4gIC8vIGFwcGVuZCB0byBzbGlkZXJcbiAgdmFyIGlzQXBwZW5kID0gaW5kZXggPT0gbGVuO1xuICBpZiAoIGlzQXBwZW5kICkge1xuICAgIHRoaXMuc2xpZGVyLmFwcGVuZENoaWxkKCBmcmFnbWVudCApO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnNlcnRDZWxsRWxlbWVudCA9IHRoaXMuY2VsbHNbIGluZGV4IF0uZWxlbWVudDtcbiAgICB0aGlzLnNsaWRlci5pbnNlcnRCZWZvcmUoIGZyYWdtZW50LCBpbnNlcnRDZWxsRWxlbWVudCApO1xuICB9XG4gIC8vIGFkZCB0byB0aGlzLmNlbGxzXG4gIGlmICggaW5kZXggPT09IDAgKSB7XG4gICAgLy8gcHJlcGVuZCwgYWRkIHRvIHN0YXJ0XG4gICAgdGhpcy5jZWxscyA9IGNlbGxzLmNvbmNhdCggdGhpcy5jZWxscyApO1xuICB9IGVsc2UgaWYgKCBpc0FwcGVuZCApIHtcbiAgICAvLyBhcHBlbmQsIGFkZCB0byBlbmRcbiAgICB0aGlzLmNlbGxzID0gdGhpcy5jZWxscy5jb25jYXQoIGNlbGxzICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaW5zZXJ0IGluIHRoaXMuY2VsbHNcbiAgICB2YXIgZW5kQ2VsbHMgPSB0aGlzLmNlbGxzLnNwbGljZSggaW5kZXgsIGxlbiAtIGluZGV4ICk7XG4gICAgdGhpcy5jZWxscyA9IHRoaXMuY2VsbHMuY29uY2F0KCBjZWxscyApLmNvbmNhdCggZW5kQ2VsbHMgKTtcbiAgfVxuXG4gIHRoaXMuX3NpemVDZWxscyggY2VsbHMgKTtcbiAgdGhpcy5jZWxsQ2hhbmdlKCBpbmRleCwgdHJ1ZSApO1xufTtcblxucHJvdG8uYXBwZW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB0aGlzLmluc2VydCggZWxlbXMsIHRoaXMuY2VsbHMubGVuZ3RoICk7XG59O1xuXG5wcm90by5wcmVwZW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB0aGlzLmluc2VydCggZWxlbXMsIDAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGNlbGxzXG4gKiBAcGFyYW0ge0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdH0gZWxlbXNcbiAqL1xucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgY2VsbHMgPSB0aGlzLmdldENlbGxzKCBlbGVtcyApO1xuICBpZiAoICFjZWxscyB8fCAhY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtaW5DZWxsSW5kZXggPSB0aGlzLmNlbGxzLmxlbmd0aCAtIDE7XG4gIC8vIHJlbW92ZSBjZWxscyBmcm9tIGNvbGxlY3Rpb24gJiBET01cbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5yZW1vdmUoKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBtaW5DZWxsSW5kZXggPSBNYXRoLm1pbiggaW5kZXgsIG1pbkNlbGxJbmRleCApO1xuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuY2VsbHMsIGNlbGwgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHRoaXMuY2VsbENoYW5nZSggbWluQ2VsbEluZGV4LCB0cnVlICk7XG59O1xuXG4vKipcbiAqIGxvZ2ljIHRvIGJlIHJ1biBhZnRlciBhIGNlbGwncyBzaXplIGNoYW5nZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbSAtIGNlbGwncyBlbGVtZW50XG4gKi9cbnByb3RvLmNlbGxTaXplQ2hhbmdlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gIGlmICggIWNlbGwgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNlbGwuZ2V0U2l6ZSgpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuY2VsbHMuaW5kZXhPZiggY2VsbCApO1xuICB0aGlzLmNlbGxDaGFuZ2UoIGluZGV4ICk7XG59O1xuXG4vKipcbiAqIGxvZ2ljIGFueSB0aW1lIGEgY2VsbCBpcyBjaGFuZ2VkOiBhZGRlZCwgcmVtb3ZlZCwgb3Igc2l6ZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGNoYW5nZWRDZWxsSW5kZXggLSBpbmRleCBvZiB0aGUgY2hhbmdlZCBjZWxsLCBvcHRpb25hbFxuICovXG5wcm90by5jZWxsQ2hhbmdlID0gZnVuY3Rpb24oIGNoYW5nZWRDZWxsSW5kZXgsIGlzUG9zaXRpb25pbmdTbGlkZXIgKSB7XG4gIHZhciBwcmV2U2VsZWN0ZWRFbGVtID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQ7XG4gIHRoaXMuX3Bvc2l0aW9uQ2VsbHMoIGNoYW5nZWRDZWxsSW5kZXggKTtcbiAgdGhpcy5fZ2V0V3JhcFNoaWZ0Q2VsbHMoKTtcbiAgdGhpcy5zZXRHYWxsZXJ5U2l6ZSgpO1xuICAvLyB1cGRhdGUgc2VsZWN0ZWRJbmRleFxuICAvLyB0cnkgdG8gbWFpbnRhaW4gcG9zaXRpb24gJiBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWQgZWxlbWVudFxuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggcHJldlNlbGVjdGVkRWxlbSApO1xuICBpZiAoIGNlbGwgKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5nZXRDZWxsU2xpZGVJbmRleCggY2VsbCApO1xuICB9XG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IE1hdGgubWluKCB0aGlzLnNsaWRlcy5sZW5ndGggLSAxLCB0aGlzLnNlbGVjdGVkSW5kZXggKTtcblxuICB0aGlzLmVtaXRFdmVudCggJ2NlbGxDaGFuZ2UnLCBbIGNoYW5nZWRDZWxsSW5kZXggXSApO1xuICAvLyBwb3NpdGlvbiBzbGlkZXJcbiAgdGhpcy5zZWxlY3QoIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICAvLyBkbyBub3QgcG9zaXRpb24gc2xpZGVyIGFmdGVyIGxhenkgbG9hZFxuICBpZiAoIGlzUG9zaXRpb25pbmdTbGlkZXIgKSB7XG4gICAgdGhpcy5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFdBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/add-remove-cell.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/animate.js":
+/*!*********************************************!*\
+ !*** ./node_modules/flickity/js/animate.js ***!
+ \*********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// animate\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( utils ) {\n return factory( window, utils );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n });\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x = x - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D tranforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i=0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i=0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvYW5pbWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvYW5pbWF0ZS5qcz8wMTUwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGFuaW1hdGVcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgdXRpbHMgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LkZsaWNraXR5ID0gd2luZG93LkZsaWNraXR5IHx8IHt9O1xuICAgIHdpbmRvdy5GbGlja2l0eS5hbmltYXRlUHJvdG90eXBlID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCB1dGlscyApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhbmltYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBwcm90byA9IHt9O1xuXG5wcm90by5zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuaXNBbmltYXRpbmcgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG4gIHRoaXMucmVzdGluZ0ZyYW1lcyA9IDA7XG4gIHRoaXMuYW5pbWF0ZSgpO1xufTtcblxucHJvdG8uYW5pbWF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmFwcGx5RHJhZ0ZvcmNlKCk7XG4gIHRoaXMuYXBwbHlTZWxlY3RlZEF0dHJhY3Rpb24oKTtcblxuICB2YXIgcHJldmlvdXNYID0gdGhpcy54O1xuXG4gIHRoaXMuaW50ZWdyYXRlUGh5c2ljcygpO1xuICB0aGlzLnBvc2l0aW9uU2xpZGVyKCk7XG4gIHRoaXMuc2V0dGxlKCBwcmV2aW91c1ggKTtcbiAgLy8gYW5pbWF0ZSBuZXh0IGZyYW1lXG4gIGlmICggdGhpcy5pc0FuaW1hdGluZyApIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggZnVuY3Rpb24gYW5pbWF0ZUZyYW1lKCkge1xuICAgICAgX3RoaXMuYW5pbWF0ZSgpO1xuICAgIH0pO1xuICB9XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IHRoaXMueDtcbiAgLy8gd3JhcCBwb3NpdGlvbiBhcm91bmRcbiAgaWYgKCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiB0aGlzLmNlbGxzLmxlbmd0aCA+IDEgKSB7XG4gICAgeCA9IHV0aWxzLm1vZHVsbyggeCwgdGhpcy5zbGlkZWFibGVXaWR0aCApO1xuICAgIHggPSB4IC0gdGhpcy5zbGlkZWFibGVXaWR0aDtcbiAgICB0aGlzLnNoaWZ0V3JhcENlbGxzKCB4ICk7XG4gIH1cblxuICB0aGlzLnNldFRyYW5zbGF0ZVgoIHgsIHRoaXMuaXNBbmltYXRpbmcgKTtcbiAgdGhpcy5kaXNwYXRjaFNjcm9sbEV2ZW50KCk7XG59O1xuXG5wcm90by5zZXRUcmFuc2xhdGVYID0gZnVuY3Rpb24oIHgsIGlzM2QgKSB7XG4gIHggKz0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgLy8gcmV2ZXJzZSBpZiByaWdodC10by1sZWZ0IGFuZCB1c2luZyB0cmFuc2Zvcm1cbiAgeCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/IC14IDogeDtcbiAgdmFyIHRyYW5zbGF0ZVggPSB0aGlzLmdldFBvc2l0aW9uVmFsdWUoIHggKTtcbiAgLy8gdXNlIDNEIHRyYW5mb3JtcyBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG9uIGlPU1xuICAvLyBidXQgdXNlIDJEIHdoZW4gc2V0dGxlZCwgZm9yIGJldHRlciBmb250LXJlbmRlcmluZ1xuICB0aGlzLnNsaWRlci5zdHlsZS50cmFuc2Zvcm0gPSBpczNkID9cbiAgICAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAnLDAsMCknIDogJ3RyYW5zbGF0ZVgoJyArIHRyYW5zbGF0ZVggKyAnKSc7XG59O1xuXG5wcm90by5kaXNwYXRjaFNjcm9sbEV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaXJzdFNsaWRlID0gdGhpcy5zbGlkZXNbMF07XG4gIGlmICggIWZpcnN0U2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBwb3NpdGlvblggPSAtdGhpcy54IC0gZmlyc3RTbGlkZS50YXJnZXQ7XG4gIHZhciBwcm9ncmVzcyA9IHBvc2l0aW9uWCAvIHRoaXMuc2xpZGVzV2lkdGg7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3Njcm9sbCcsIG51bGwsIFsgcHJvZ3Jlc3MsIHBvc2l0aW9uWCBdICk7XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMueCA9IC10aGlzLnNlbGVjdGVkU2xpZGUudGFyZ2V0O1xuICB0aGlzLnZlbG9jaXR5ID0gMDsgLy8gc3RvcCB3b2JibGVcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xufTtcblxucHJvdG8uZ2V0UG9zaXRpb25WYWx1ZSA9IGZ1bmN0aW9uKCBwb3NpdGlvbiApIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICkge1xuICAgIC8vIHBlcmNlbnQgcG9zaXRpb24sIHJvdW5kIHRvIDIgZGlnaXRzLCBsaWtlIDEyLjM0JVxuICAgIHJldHVybiAoIE1hdGgucm91bmQoICggcG9zaXRpb24gLyB0aGlzLnNpemUuaW5uZXJXaWR0aCApICogMTAwMDAgKSAqIDAuMDEgKSsgJyUnO1xuICB9IGVsc2Uge1xuICAgIC8vIHBpeGVsIHBvc2l0aW9uaW5nXG4gICAgcmV0dXJuIE1hdGgucm91bmQoIHBvc2l0aW9uICkgKyAncHgnO1xuICB9XG59O1xuXG5wcm90by5zZXR0bGUgPSBmdW5jdGlvbiggcHJldmlvdXNYICkge1xuICAvLyBrZWVwIHRyYWNrIG9mIGZyYW1lcyB3aGVyZSB4IGhhc24ndCBtb3ZlZFxuICBpZiAoICF0aGlzLmlzUG9pbnRlckRvd24gJiYgTWF0aC5yb3VuZCggdGhpcy54ICogMTAwICkgPT0gTWF0aC5yb3VuZCggcHJldmlvdXNYICogMTAwICkgKSB7XG4gICAgdGhpcy5yZXN0aW5nRnJhbWVzKys7XG4gIH1cbiAgLy8gc3RvcCBhbmltYXRpbmcgaWYgcmVzdGluZyBmb3IgMyBvciBtb3JlIGZyYW1lc1xuICBpZiAoIHRoaXMucmVzdGluZ0ZyYW1lcyA+IDIgKSB7XG4gICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLmlzRnJlZVNjcm9sbGluZztcbiAgICAvLyByZW5kZXIgcG9zaXRpb24gd2l0aCB0cmFuc2xhdGVYIHdoZW4gc2V0dGxlZFxuICAgIHRoaXMucG9zaXRpb25TbGlkZXIoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoICdzZXR0bGUnLCBudWxsLCBbIHRoaXMuc2VsZWN0ZWRJbmRleCBdICk7XG4gIH1cbn07XG5cbnByb3RvLnNoaWZ0V3JhcENlbGxzID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHNoaWZ0IGJlZm9yZSBjZWxsc1xuICB2YXIgYmVmb3JlR2FwID0gdGhpcy5jdXJzb3JQb3NpdGlvbiArIHg7XG4gIHRoaXMuX3NoaWZ0Q2VsbHMoIHRoaXMuYmVmb3JlU2hpZnRDZWxscywgYmVmb3JlR2FwLCAtMSApO1xuICAvLyBzaGlmdCBhZnRlciBjZWxsc1xuICB2YXIgYWZ0ZXJHYXAgPSB0aGlzLnNpemUuaW5uZXJXaWR0aCAtICggeCArIHRoaXMuc2xpZGVhYmxlV2lkdGggKyB0aGlzLmN1cnNvclBvc2l0aW9uICk7XG4gIHRoaXMuX3NoaWZ0Q2VsbHMoIHRoaXMuYWZ0ZXJTaGlmdENlbGxzLCBhZnRlckdhcCwgMSApO1xufTtcblxucHJvdG8uX3NoaWZ0Q2VsbHMgPSBmdW5jdGlvbiggY2VsbHMsIGdhcCwgc2hpZnQgKSB7XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgY2VsbCA9IGNlbGxzW2ldO1xuICAgIHZhciBjZWxsU2hpZnQgPSBnYXAgPiAwID8gc2hpZnQgOiAwO1xuICAgIGNlbGwud3JhcFNoaWZ0KCBjZWxsU2hpZnQgKTtcbiAgICBnYXAgLT0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLl91bnNoaWZ0Q2VsbHMgPSBmdW5jdGlvbiggY2VsbHMgKSB7XG4gIGlmICggIWNlbGxzIHx8ICFjZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICBjZWxsc1tpXS53cmFwU2hpZnQoIDAgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGh5c2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5pbnRlZ3JhdGVQaHlzaWNzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMueCArPSB0aGlzLnZlbG9jaXR5O1xuICB0aGlzLnZlbG9jaXR5ICo9IHRoaXMuZ2V0RnJpY3Rpb25GYWN0b3IoKTtcbn07XG5cbnByb3RvLmFwcGx5Rm9yY2UgPSBmdW5jdGlvbiggZm9yY2UgKSB7XG4gIHRoaXMudmVsb2NpdHkgKz0gZm9yY2U7XG59O1xuXG5wcm90by5nZXRGcmljdGlvbkZhY3RvciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gMSAtIHRoaXMub3B0aW9uc1sgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPyAnZnJlZVNjcm9sbEZyaWN0aW9uJyA6ICdmcmljdGlvbicgXTtcbn07XG5cbnByb3RvLmdldFJlc3RpbmdQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBteSB0aGFua3MgdG8gU3RldmVuIFdpdHRlbnMsIHdobyBzaW1wbGlmaWVkIHRoaXMgbWF0aCBncmVhdGx5XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLnZlbG9jaXR5IC8gKCAxIC0gdGhpcy5nZXRGcmljdGlvbkZhY3RvcigpICk7XG59O1xuXG5wcm90by5hcHBseURyYWdGb3JjZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlIHx8ICF0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNoYW5nZSB0aGUgcG9zaXRpb24gdG8gZHJhZyBwb3NpdGlvbiBieSBhcHBseWluZyBmb3JjZVxuICB2YXIgZHJhZ1ZlbG9jaXR5ID0gdGhpcy5kcmFnWCAtIHRoaXMueDtcbiAgdmFyIGRyYWdGb3JjZSA9IGRyYWdWZWxvY2l0eSAtIHRoaXMudmVsb2NpdHk7XG4gIHRoaXMuYXBwbHlGb3JjZSggZHJhZ0ZvcmNlICk7XG59O1xuXG5wcm90by5hcHBseVNlbGVjdGVkQXR0cmFjdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBkbyBub3QgYXR0cmFjdCBpZiBwb2ludGVyIGRvd24gb3Igbm8gc2xpZGVzXG4gIHZhciBkcmFnRG93biA9IHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5pc1BvaW50ZXJEb3duO1xuICBpZiAoIGRyYWdEb3duIHx8IHRoaXMuaXNGcmVlU2Nyb2xsaW5nIHx8ICF0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBkaXN0YW5jZSA9IHRoaXMuc2VsZWN0ZWRTbGlkZS50YXJnZXQgKiAtMSAtIHRoaXMueDtcbiAgdmFyIGZvcmNlID0gZGlzdGFuY2UgKiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRBdHRyYWN0aW9uO1xuICB0aGlzLmFwcGx5Rm9yY2UoIGZvcmNlICk7XG59O1xuXG5yZXR1cm4gcHJvdG87XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/animate.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/cell.js":
+/*!******************************************!*\
+ !*** ./node_modules/flickity/js/cell.js ***!
+ \******************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( getSize ) {\n return factory( window, getSize );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvY2VsbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvY2VsbC5qcz9jOGRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZsaWNraXR5LkNlbGxcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgXSwgZnVuY3Rpb24oIGdldFNpemUgKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBnZXRTaXplICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuQ2VsbCA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuZ2V0U2l6ZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIGdldFNpemUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gQ2VsbCggZWxlbSwgcGFyZW50ICkge1xuICB0aGlzLmVsZW1lbnQgPSBlbGVtO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICB0aGlzLmNyZWF0ZSgpO1xufVxuXG52YXIgcHJvdG8gPSBDZWxsLnByb3RvdHlwZTtcblxucHJvdG8uY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsICd0cnVlJyApO1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnNoaWZ0ID0gMDtcbn07XG5cbnByb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVzZXQgc3R5bGVcbiAgdGhpcy51bnNlbGVjdCgpO1xuICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJztcbiAgdmFyIHNpZGUgPSB0aGlzLnBhcmVudC5vcmlnaW5TaWRlO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIHNpZGUgXSA9ICcnO1xufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMudXBkYXRlVGFyZ2V0KCk7XG4gIHRoaXMucmVuZGVyUG9zaXRpb24oIHggKTtcbn07XG5cbi8vIHNldERlZmF1bHRUYXJnZXQgdjEgbWV0aG9kLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVtb3ZlIGluIHYzXG5wcm90by51cGRhdGVUYXJnZXQgPSBwcm90by5zZXREZWZhdWx0VGFyZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtYXJnaW5Qcm9wZXJ0eSA9IHRoaXMucGFyZW50Lm9yaWdpblNpZGUgPT0gJ2xlZnQnID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgdGhpcy50YXJnZXQgPSB0aGlzLnggKyB0aGlzLnNpemVbIG1hcmdpblByb3BlcnR5IF0gK1xuICAgIHRoaXMuc2l6ZS53aWR0aCAqIHRoaXMucGFyZW50LmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLnJlbmRlclBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHJlbmRlciBwb3NpdGlvbiBvZiBjZWxsIHdpdGggaW4gc2xpZGVyXG4gIHZhciBzaWRlID0gdGhpcy5wYXJlbnQub3JpZ2luU2lkZTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlWyBzaWRlIF0gPSB0aGlzLnBhcmVudC5nZXRQb3NpdGlvblZhbHVlKCB4ICk7XG59O1xuXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzLXNlbGVjdGVkJyk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtc2VsZWN0ZWQnKTtcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gZmFjdG9yIC0gMCwgMSwgb3IgLTFcbioqL1xucHJvdG8ud3JhcFNoaWZ0ID0gZnVuY3Rpb24oIHNoaWZ0ICkge1xuICB0aGlzLnNoaWZ0ID0gc2hpZnQ7XG4gIHRoaXMucmVuZGVyUG9zaXRpb24oIHRoaXMueCArIHRoaXMucGFyZW50LnNsaWRlYWJsZVdpZHRoICogc2hpZnQgKTtcbn07XG5cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG59O1xuXG5yZXR1cm4gQ2VsbDtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/cell.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/drag.js":
+/*!******************************************!*\
+ !*** ./node_modules/flickity/js/drag.js ***!
+ \******************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// drag\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n __webpack_require__(/*! unidragger/unidragger */ \"./node_modules/unidragger/unidragger.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, Unidragger, utils ) {\n return factory( window, Flickity, Unidragger, utils );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n // #457, RubaXa/Sortable#973\n if ( isTouch && !isTouchmoveScrollCanceled ) {\n window.addEventListener( 'touchmove', function() {});\n isTouchmoveScrollCanceled = true;\n }\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x = moveVector.x % this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZHJhZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZHJhZy5qcz80OTY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGRyYWdcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAndW5pZHJhZ2dlci91bmlkcmFnZ2VyJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscydcbiAgICBdLCBmdW5jdGlvbiggRmxpY2tpdHksIFVuaWRyYWdnZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaWRyYWdnZXIsIHV0aWxzICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCcuL2ZsaWNraXR5JyksXG4gICAgICByZXF1aXJlKCd1bmlkcmFnZ2VyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVW5pZHJhZ2dlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pZHJhZ2dlciwgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gZGVmYXVsdHMgLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBkcmFnZ2FibGU6ICc+MScsXG4gIGRyYWdUaHJlc2hvbGQ6IDMsXG59KTtcblxuLy8gLS0tLS0gY3JlYXRlIC0tLS0tIC8vXG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZURyYWcnKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZHJhZyBwcm90b3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xudXRpbHMuZXh0ZW5kKCBwcm90bywgVW5pZHJhZ2dlci5wcm90b3R5cGUgKTtcbnByb3RvLl90b3VjaEFjdGlvblZhbHVlID0gJ3Bhbi15JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1RvdWNoID0gJ2NyZWF0ZVRvdWNoJyBpbiBkb2N1bWVudDtcbnZhciBpc1RvdWNobW92ZVNjcm9sbENhbmNlbGVkID0gZmFsc2U7XG5cbnByb3RvLl9jcmVhdGVEcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMub25BY3RpdmF0ZURyYWcgKTtcbiAgdGhpcy5vbiggJ3VpQ2hhbmdlJywgdGhpcy5fdWlDaGFuZ2VEcmFnICk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5vbkRlYWN0aXZhdGVEcmFnICk7XG4gIHRoaXMub24oICdjZWxsQ2hhbmdlJywgdGhpcy51cGRhdGVEcmFnZ2FibGUgKTtcbiAgLy8gVE9ETyB1cGRhdGVEcmFnZ2FibGUgb24gcmVzaXplPyBpZiBncm91cENlbGxzICYgc2xpZGVzIGNoYW5nZVxuICAvLyBIQUNLIC0gYWRkIHNlZW1pbmdseSBpbm5vY3VvdXMgaGFuZGxlciB0byBmaXggaU9TIDEwIHNjcm9sbCBiZWhhdmlvclxuICAvLyAjNDU3LCBSdWJhWGEvU29ydGFibGUjOTczXG4gIGlmICggaXNUb3VjaCAmJiAhaXNUb3VjaG1vdmVTY3JvbGxDYW5jZWxlZCApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIGZ1bmN0aW9uKCkge30pO1xuICAgIGlzVG91Y2htb3ZlU2Nyb2xsQ2FuY2VsZWQgPSB0cnVlO1xuICB9XG59O1xuXG5wcm90by5vbkFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmhhbmRsZXMgPSBbIHRoaXMudmlld3BvcnQgXTtcbiAgdGhpcy5iaW5kSGFuZGxlcygpO1xuICB0aGlzLnVwZGF0ZURyYWdnYWJsZSgpO1xufTtcblxucHJvdG8ub25EZWFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnVuYmluZEhhbmRsZXMoKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xufTtcblxucHJvdG8udXBkYXRlRHJhZ2dhYmxlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRpc2FibGUgZHJhZ2dpbmcgaWYgbGVzcyB0aGFuIDIgc2xpZGVzLiAjMjc4XG4gIGlmICggdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9PSAnPjEnICkge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLnNsaWRlcy5sZW5ndGggPiAxO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlO1xuICB9XG4gIGlmICggdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtZHJhZ2dhYmxlJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xuICB9XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxucHJvdG8uYmluZERyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9IHRydWU7XG4gIHRoaXMudXBkYXRlRHJhZ2dhYmxlKCk7XG59O1xuXG5wcm90by51bmJpbmREcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVEcmFnZ2FibGUoKTtcbn07XG5cbnByb3RvLl91aUNoYW5nZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcG9pbnRlciBldmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9wb2ludGVyRG93blByZXZlbnREZWZhdWx0KCBldmVudCApO1xuICB0aGlzLnBvaW50ZXJEb3duRm9jdXMoIGV2ZW50ICk7XG4gIC8vIGJsdXJcbiAgaWYgKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZWxlbWVudCApIHtcbiAgICAvLyBkbyBub3QgYmx1ciBpZiBhbHJlYWR5IGZvY3VzZWRcbiAgICB0aGlzLnBvaW50ZXJEb3duQmx1cigpO1xuICB9XG5cbiAgLy8gc3RvcCBpZiBpdCB3YXMgbW92aW5nXG4gIHRoaXMuZHJhZ1ggPSB0aGlzLng7XG4gIHRoaXMudmlld3BvcnQuY2xhc3NMaXN0LmFkZCgnaXMtcG9pbnRlci1kb3duJyk7XG4gIC8vIHRyYWNrIHNjcm9sbGluZ1xuICB0aGlzLnBvaW50ZXJEb3duU2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCB0aGlzICk7XG5cbiAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gZGVmYXVsdCBwb2ludGVyRG93biBsb2dpYywgdXNlZCBmb3Igc3RhdGljQ2xpY2tcbnByb3RvLl9wb2ludGVyRG93bkRlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHRyYWNrIHN0YXJ0IGV2ZW50IHBvc2l0aW9uXG4gIC8vIFNhZmFyaSA5IG92ZXJyaWRlcyBwYWdlWCBhbmQgcGFnZVkuIFRoZXNlIHZhbHVlcyBuZWVkcyB0byBiZSBjb3BpZWQuICM3NzlcbiAgdGhpcy5wb2ludGVyRG93blBvaW50ZXIgPSB7XG4gICAgcGFnZVg6IHBvaW50ZXIucGFnZVgsXG4gICAgcGFnZVk6IHBvaW50ZXIucGFnZVksXG4gIH07XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyRG93bicsIGV2ZW50LCBbIHBvaW50ZXIgXSApO1xufTtcblxudmFyIGZvY3VzTm9kZXMgPSB7XG4gIElOUFVUOiB0cnVlLFxuICBURVhUQVJFQTogdHJ1ZSxcbiAgU0VMRUNUOiB0cnVlLFxufTtcblxucHJvdG8ucG9pbnRlckRvd25Gb2N1cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzRm9jdXNOb2RlICkge1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxufTtcblxucHJvdG8uX3BvaW50ZXJEb3duUHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc1RvdWNoU3RhcnQgPSBldmVudC50eXBlID09ICd0b3VjaHN0YXJ0JztcbiAgdmFyIGlzVG91Y2hQb2ludGVyID0gZXZlbnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJztcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzVG91Y2hTdGFydCAmJiAhaXNUb3VjaFBvaW50ZXIgJiYgIWlzRm9jdXNOb2RlICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIG1vdmUgLS0tLS0gLy9cblxucHJvdG8uaGFzRHJhZ1N0YXJ0ZWQgPSBmdW5jdGlvbiggbW92ZVZlY3RvciApIHtcbiAgcmV0dXJuIE1hdGguYWJzKCBtb3ZlVmVjdG9yLnggKSA+IHRoaXMub3B0aW9ucy5kcmFnVGhyZXNob2xkO1xufTtcblxuLy8gLS0tLS0gdXAgLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBkZWxldGUgdGhpcy5pc1RvdWNoU2Nyb2xsaW5nO1xuICB0aGlzLnZpZXdwb3J0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLXBvaW50ZXItZG93bicpO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyVXAnLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbiAgdGhpcy5fZHJhZ1BvaW50ZXJVcCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgdGhpcyApO1xuICBkZWxldGUgdGhpcy5wb2ludGVyRG93blNjcm9sbDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRyYWdnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCAhdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiA9IHRoaXMueDtcbiAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsIHRoaXMgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnZHJhZ1N0YXJ0JywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3BvaW50ZXJNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG4gIHRoaXMuX2RyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxucHJvdG8uZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgdGhpcy5wcmV2aW91c0RyYWdYID0gdGhpcy5kcmFnWDtcbiAgLy8gcmV2ZXJzZSBpZiByaWdodC10by1sZWZ0XG4gIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAtMSA6IDE7XG4gIGlmICggdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gd3JhcCBhcm91bmQgbW92ZS4gIzU4OVxuICAgIG1vdmVWZWN0b3IueCA9IG1vdmVWZWN0b3IueCAlIHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH1cbiAgdmFyIGRyYWdYID0gdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiArIG1vdmVWZWN0b3IueCAqIGRpcmVjdGlvbjtcblxuICBpZiAoICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiB0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgLy8gc2xvdyBkcmFnXG4gICAgdmFyIG9yaWdpbkJvdW5kID0gTWF0aC5tYXgoIC10aGlzLnNsaWRlc1swXS50YXJnZXQsIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKTtcbiAgICBkcmFnWCA9IGRyYWdYID4gb3JpZ2luQm91bmQgPyAoIGRyYWdYICsgb3JpZ2luQm91bmQgKSAqIDAuNSA6IGRyYWdYO1xuICAgIHZhciBlbmRCb3VuZCA9IE1hdGgubWluKCAtdGhpcy5nZXRMYXN0U2xpZGUoKS50YXJnZXQsIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKTtcbiAgICBkcmFnWCA9IGRyYWdYIDwgZW5kQm91bmQgPyAoIGRyYWdYICsgZW5kQm91bmQgKSAqIDAuNSA6IGRyYWdYO1xuICB9XG5cbiAgdGhpcy5kcmFnWCA9IGRyYWdYO1xuXG4gIHRoaXMuZHJhZ01vdmVUaW1lID0gbmV3IERhdGUoKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnZHJhZ01vdmUnLCBldmVudCwgWyBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbn07XG5cbnByb3RvLmRyYWdFbmQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICggdGhpcy5vcHRpb25zLmZyZWVTY3JvbGwgKSB7XG4gICAgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPSB0cnVlO1xuICB9XG4gIC8vIHNldCBzZWxlY3RlZEluZGV4IGJhc2VkIG9uIHdoZXJlIGZsaWNrIHdpbGwgZW5kIHVwXG4gIHZhciBpbmRleCA9IHRoaXMuZHJhZ0VuZFJlc3RpbmdTZWxlY3QoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICYmICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICAvLyBpZiBmcmVlLXNjcm9sbCAmIG5vdCB3cmFwIGFyb3VuZFxuICAgIC8vIGRvIG5vdCBmcmVlLXNjcm9sbCBpZiBnb2luZyBvdXRzaWRlIG9mIGJvdW5kaW5nIHNsaWRlc1xuICAgIC8vIHNvIGJvdW5kaW5nIHNsaWRlcyBjYW4gYXR0cmFjdCBzbGlkZXIsIGFuZCBrZWVwIGl0IGluIGJvdW5kc1xuICAgIHZhciByZXN0aW5nWCA9IHRoaXMuZ2V0UmVzdGluZ1Bvc2l0aW9uKCk7XG4gICAgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPSAtcmVzdGluZ1ggPiB0aGlzLnNsaWRlc1swXS50YXJnZXQgJiZcbiAgICAgIC1yZXN0aW5nWCA8IHRoaXMuZ2V0TGFzdFNsaWRlKCkudGFyZ2V0O1xuICB9IGVsc2UgaWYgKCAhdGhpcy5vcHRpb25zLmZyZWVTY3JvbGwgJiYgaW5kZXggPT0gdGhpcy5zZWxlY3RlZEluZGV4ICkge1xuICAgIC8vIGJvb3N0IHNlbGVjdGlvbiBpZiBzZWxlY3RlZCBpbmRleCBoYXMgbm90IGNoYW5nZWRcbiAgICBpbmRleCArPSB0aGlzLmRyYWdFbmRCb29zdFNlbGVjdCgpO1xuICB9XG4gIGRlbGV0ZSB0aGlzLnByZXZpb3VzRHJhZ1g7XG4gIC8vIGFwcGx5IHNlbGVjdGlvblxuICAvLyBUT0RPIHJlZmFjdG9yIHRoaXMsIHNlbGVjdGluZyBoZXJlIGZlZWxzIHdlaXJkXG4gIC8vIEhBQ0ssIHNldCBmbGFnIHNvIGRyYWdnaW5nIHN0YXlzIGluIGNvcnJlY3QgZGlyZWN0aW9uXG4gIHRoaXMuaXNEcmFnU2VsZWN0ID0gdGhpcy5vcHRpb25zLndyYXBBcm91bmQ7XG4gIHRoaXMuc2VsZWN0KCBpbmRleCApO1xuICBkZWxldGUgdGhpcy5pc0RyYWdTZWxlY3Q7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2RyYWdFbmQnLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbn07XG5cbnByb3RvLmRyYWdFbmRSZXN0aW5nU2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXN0aW5nWCA9IHRoaXMuZ2V0UmVzdGluZ1Bvc2l0aW9uKCk7XG4gIC8vIGhvdyBmYXIgYXdheSBmcm9tIHNlbGVjdGVkIHNsaWRlXG4gIHZhciBkaXN0YW5jZSA9IE1hdGguYWJzKCB0aGlzLmdldFNsaWRlRGlzdGFuY2UoIC1yZXN0aW5nWCwgdGhpcy5zZWxlY3RlZEluZGV4ICkgKTtcbiAgLy8gZ2V0IGNsb3NldCByZXN0aW5nIGdvaW5nIHVwIGFuZCBnb2luZyBkb3duXG4gIHZhciBwb3NpdGl2ZVJlc3RpbmcgPSB0aGlzLl9nZXRDbG9zZXN0UmVzdGluZyggcmVzdGluZ1gsIGRpc3RhbmNlLCAxICk7XG4gIHZhciBuZWdhdGl2ZVJlc3RpbmcgPSB0aGlzLl9nZXRDbG9zZXN0UmVzdGluZyggcmVzdGluZ1gsIGRpc3RhbmNlLCAtMSApO1xuICAvLyB1c2UgY2xvc2VyIHJlc3RpbmcgZm9yIHdyYXAtYXJvdW5kXG4gIHZhciBpbmRleCA9IHBvc2l0aXZlUmVzdGluZy5kaXN0YW5jZSA8IG5lZ2F0aXZlUmVzdGluZy5kaXN0YW5jZSA/XG4gICAgcG9zaXRpdmVSZXN0aW5nLmluZGV4IDogbmVnYXRpdmVSZXN0aW5nLmluZGV4O1xuICByZXR1cm4gaW5kZXg7XG59O1xuXG4vKipcbiAqIGdpdmVuIHJlc3RpbmcgWCBhbmQgZGlzdGFuY2UgdG8gc2VsZWN0ZWQgY2VsbFxuICogZ2V0IHRoZSBkaXN0YW5jZSBhbmQgaW5kZXggb2YgdGhlIGNsb3Nlc3QgY2VsbFxuICogQHBhcmFtIHtOdW1iZXJ9IHJlc3RpbmdYIC0gZXN0aW1hdGVkIHBvc3QtZmxpY2sgcmVzdGluZyBwb3NpdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlIC0gZGlzdGFuY2UgdG8gc2VsZWN0ZWQgY2VsbFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmNyZW1lbnQgLSArMSBvciAtMSwgZ29pbmcgdXAgb3IgZG93blxuICogQHJldHVybnMge09iamVjdH0gLSB7IGRpc3RhbmNlOiB7TnVtYmVyfSwgaW5kZXg6IHtJbnRlZ2VyfSB9XG4gKi9cbnByb3RvLl9nZXRDbG9zZXN0UmVzdGluZyA9IGZ1bmN0aW9uKCByZXN0aW5nWCwgZGlzdGFuY2UsIGluY3JlbWVudCApIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuICB2YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgdmFyIGNvbmRpdGlvbiA9IHRoaXMub3B0aW9ucy5jb250YWluICYmICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCA/XG4gICAgLy8gaWYgY29udGFpbiwga2VlcCBnb2luZyBpZiBkaXN0YW5jZSBpcyBlcXVhbCB0byBtaW5EaXN0YW5jZVxuICAgIGZ1bmN0aW9uKCBkLCBtZCApIHsgcmV0dXJuIGQgPD0gbWQ7IH0gOiBmdW5jdGlvbiggZCwgbWQgKSB7IHJldHVybiBkIDwgbWQ7IH07XG4gIHdoaWxlICggY29uZGl0aW9uKCBkaXN0YW5jZSwgbWluRGlzdGFuY2UgKSApIHtcbiAgICAvLyBtZWFzdXJlIGRpc3RhbmNlIHRvIG5leHQgY2VsbFxuICAgIGluZGV4ICs9IGluY3JlbWVudDtcbiAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIGluZGV4ICk7XG4gICAgaWYgKCBkaXN0YW5jZSA9PT0gbnVsbCApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzdGFuY2U6IG1pbkRpc3RhbmNlLFxuICAgIC8vIHNlbGVjdGVkIHdhcyBwcmV2aW91cyBpbmRleFxuICAgIGluZGV4OiBpbmRleCAtIGluY3JlbWVudFxuICB9O1xufTtcblxuLyoqXG4gKiBtZWFzdXJlIGRpc3RhbmNlIGJldHdlZW4geCBhbmQgYSBzbGlkZSB0YXJnZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IC0gc2xpZGUgaW5kZXhcbiAqL1xucHJvdG8uZ2V0U2xpZGVEaXN0YW5jZSA9IGZ1bmN0aW9uKCB4LCBpbmRleCApIHtcbiAgdmFyIGxlbiA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgLy8gd3JhcCBhcm91bmQgaWYgYXQgbGVhc3QgMiBzbGlkZXNcbiAgdmFyIGlzV3JhcEFyb3VuZCA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICYmIGxlbiA+IDE7XG4gIHZhciBzbGlkZUluZGV4ID0gaXNXcmFwQXJvdW5kID8gdXRpbHMubW9kdWxvKCBpbmRleCwgbGVuICkgOiBpbmRleDtcbiAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbIHNsaWRlSW5kZXggXTtcbiAgaWYgKCAhc2xpZGUgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gYWRkIGRpc3RhbmNlIGZvciB3cmFwLWFyb3VuZCBzbGlkZXNcbiAgdmFyIHdyYXAgPSBpc1dyYXBBcm91bmQgPyB0aGlzLnNsaWRlYWJsZVdpZHRoICogTWF0aC5mbG9vciggaW5kZXggLyBsZW4gKSA6IDA7XG4gIHJldHVybiB4IC0gKCBzbGlkZS50YXJnZXQgKyB3cmFwICk7XG59O1xuXG5wcm90by5kcmFnRW5kQm9vc3RTZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IGJvb3N0IGlmIG5vIHByZXZpb3VzRHJhZ1ggb3IgZHJhZ01vdmVUaW1lXG4gIGlmICggdGhpcy5wcmV2aW91c0RyYWdYID09PSB1bmRlZmluZWQgfHwgIXRoaXMuZHJhZ01vdmVUaW1lIHx8XG4gICAgLy8gb3IgaWYgZHJhZyB3YXMgaGVsZCBmb3IgMTAwIG1zXG4gICAgbmV3IERhdGUoKSAtIHRoaXMuZHJhZ01vdmVUaW1lID4gMTAwICkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtdGhpcy5kcmFnWCwgdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIHZhciBkZWx0YSA9IHRoaXMucHJldmlvdXNEcmFnWCAtIHRoaXMuZHJhZ1g7XG4gIGlmICggZGlzdGFuY2UgPiAwICYmIGRlbHRhID4gMCApIHtcbiAgICAvLyBib29zdCB0byBuZXh0IGlmIG1vdmluZyB0b3dhcmRzIHRoZSByaWdodCwgYW5kIHBvc2l0aXZlIHZlbG9jaXR5XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoIGRpc3RhbmNlIDwgMCAmJiBkZWx0YSA8IDAgKSB7XG4gICAgLy8gYm9vc3QgdG8gcHJldmlvdXMgaWYgbW92aW5nIHRvd2FyZHMgdGhlIGxlZnQsIGFuZCBuZWdhdGl2ZSB2ZWxvY2l0eVxuICAgIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbi8vIC0tLS0tIHN0YXRpY0NsaWNrIC0tLS0tIC8vXG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBnZXQgY2xpY2tlZENlbGwsIGlmIGNlbGwgd2FzIGNsaWNrZWRcbiAgdmFyIGNsaWNrZWRDZWxsID0gdGhpcy5nZXRQYXJlbnRDZWxsKCBldmVudC50YXJnZXQgKTtcbiAgdmFyIGNlbGxFbGVtID0gY2xpY2tlZENlbGwgJiYgY2xpY2tlZENlbGwuZWxlbWVudDtcbiAgdmFyIGNlbGxJbmRleCA9IGNsaWNrZWRDZWxsICYmIHRoaXMuY2VsbHMuaW5kZXhPZiggY2xpY2tlZENlbGwgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnc3RhdGljQ2xpY2snLCBldmVudCwgWyBwb2ludGVyLCBjZWxsRWxlbSwgY2VsbEluZGV4IF0gKTtcbn07XG5cbi8vIC0tLS0tIHNjcm9sbCAtLS0tLSAvL1xuXG5wcm90by5vbnNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgdmFyIHNjcm9sbE1vdmVYID0gdGhpcy5wb2ludGVyRG93blNjcm9sbC54IC0gc2Nyb2xsLng7XG4gIHZhciBzY3JvbGxNb3ZlWSA9IHRoaXMucG9pbnRlckRvd25TY3JvbGwueSAtIHNjcm9sbC55O1xuICAvLyBjYW5jZWwgY2xpY2svdGFwIGlmIHNjcm9sbCBpcyB0b28gbXVjaFxuICBpZiAoIE1hdGguYWJzKCBzY3JvbGxNb3ZlWCApID4gMyB8fCBNYXRoLmFicyggc2Nyb2xsTW92ZVkgKSA+IDMgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvbmUoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gdXRpbHMgLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24oKSB7XG4gIHJldHVybiB7XG4gICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICB9O1xufVxuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/drag.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/flickity.js":
+/*!**********************************************!*\
+ !*** ./node_modules/flickity/js/flickity.js ***!
+ \**********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Flickity main\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\"),\n __webpack_require__(/*! ./cell */ \"./node_modules/flickity/js/cell.js\"),\n __webpack_require__(/*! ./slide */ \"./node_modules/flickity/js/slide.js\"),\n __webpack_require__(/*! ./animate */ \"./node_modules/flickity/js/animate.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else { var _Flickity; }\n\n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i=index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n });\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match(/^(\\d+)%$/);\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5\n },\n left: {\n left: 0,\n right: 1\n },\n right: {\n right: 0,\n left: 1\n }\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i=0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i=0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match(/^[#\\.]?[\\d\\/]/) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility ||isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n });\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZmxpY2tpdHkuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2ZsaWNraXR5LmpzPzEzODUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmxpY2tpdHkgbWFpblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgJ2dldC1zaXplL2dldC1zaXplJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscycsXG4gICAgICAnLi9jZWxsJyxcbiAgICAgICcuL3NsaWRlJyxcbiAgICAgICcuL2FuaW1hdGUnXG4gICAgXSwgZnVuY3Rpb24oIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIENlbGwsIFNsaWRlLCBhbmltYXRlUHJvdG90eXBlICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgQ2VsbCwgU2xpZGUsIGFuaW1hdGVQcm90b3R5cGUgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICAgcmVxdWlyZSgnLi9jZWxsJyksXG4gICAgICByZXF1aXJlKCcuL3NsaWRlJyksXG4gICAgICByZXF1aXJlKCcuL2FuaW1hdGUnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB2YXIgX0ZsaWNraXR5ID0gd2luZG93LkZsaWNraXR5O1xuXG4gICAgd2luZG93LkZsaWNraXR5ID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICBfRmxpY2tpdHkuQ2VsbCxcbiAgICAgIF9GbGlja2l0eS5TbGlkZSxcbiAgICAgIF9GbGlja2l0eS5hbmltYXRlUHJvdG90eXBlXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLFxuICB1dGlscywgQ2VsbCwgU2xpZGUsIGFuaW1hdGVQcm90b3R5cGUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gdmFyc1xudmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG52YXIgZ2V0Q29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlO1xudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcblxuZnVuY3Rpb24gbW92ZUVsZW1lbnRzKCBlbGVtcywgdG9FbGVtICkge1xuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgd2hpbGUgKCBlbGVtcy5sZW5ndGggKSB7XG4gICAgdG9FbGVtLmFwcGVuZENoaWxkKCBlbGVtcy5zaGlmdCgpICk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXJzXG52YXIgR1VJRCA9IDA7XG4vLyBpbnRlcm5hbCBzdG9yZSBvZiBhbGwgRmxpY2tpdHkgaW50YW5jZXNcbnZhciBpbnN0YW5jZXMgPSB7fTtcblxuZnVuY3Rpb24gRmxpY2tpdHkoIGVsZW1lbnQsIG9wdGlvbnMgKSB7XG4gIHZhciBxdWVyeUVsZW1lbnQgPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgaWYgKCAhcXVlcnlFbGVtZW50ICkge1xuICAgIGlmICggY29uc29sZSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdCYWQgZWxlbWVudCBmb3IgRmxpY2tpdHk6ICcgKyAoIHF1ZXJ5RWxlbWVudCB8fCBlbGVtZW50ICkgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudCA9IHF1ZXJ5RWxlbWVudDtcbiAgLy8gZG8gbm90IGluaXRpYWxpemUgdHdpY2Ugb24gc2FtZSBlbGVtZW50XG4gIGlmICggdGhpcy5lbGVtZW50LmZsaWNraXR5R1VJRCApIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQgXTtcbiAgICBpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvLyBhZGQgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICB9XG4gIC8vIG9wdGlvbnNcbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuZXh0ZW5kKCB7fSwgdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0cyApO1xuICB0aGlzLm9wdGlvbiggb3B0aW9ucyApO1xuXG4gIC8vIGtpY2sgdGhpbmdzIG9mZlxuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuRmxpY2tpdHkuZGVmYXVsdHMgPSB7XG4gIGFjY2Vzc2liaWxpdHk6IHRydWUsXG4gIC8vIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgY2VsbEFsaWduOiAnY2VudGVyJyxcbiAgLy8gY2VsbFNlbGVjdG9yOiB1bmRlZmluZWQsXG4gIC8vIGNvbnRhaW46IGZhbHNlLFxuICBmcmVlU2Nyb2xsRnJpY3Rpb246IDAuMDc1LCAvLyBmcmljdGlvbiB3aGVuIGZyZWUtc2Nyb2xsaW5nXG4gIGZyaWN0aW9uOiAwLjI4LCAvLyBmcmljdGlvbiB3aGVuIHNlbGVjdGluZ1xuICBuYW1lc3BhY2VKUXVlcnlFdmVudHM6IHRydWUsXG4gIC8vIGluaXRpYWxJbmRleDogMCxcbiAgcGVyY2VudFBvc2l0aW9uOiB0cnVlLFxuICByZXNpemU6IHRydWUsXG4gIHNlbGVjdGVkQXR0cmFjdGlvbjogMC4wMjUsXG4gIHNldEdhbGxlcnlTaXplOiB0cnVlXG4gIC8vIHdhdGNoQ1NTOiBmYWxzZSxcbiAgLy8gd3JhcEFyb3VuZDogZmFsc2Vcbn07XG5cbi8vIGhhc2ggb2YgbWV0aG9kcyB0cmlnZ2VyZWQgb24gX2NyZWF0ZSgpXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzID0gW107XG5cbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZlbnRFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbnByb3RvLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gYWRkIGlkIGZvciBGbGlja2l0eS5kYXRhXG4gIHZhciBpZCA9IHRoaXMuZ3VpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50LmZsaWNraXR5R1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcbiAgLy8gaW5pdGlhbCBwcm9wZXJ0aWVzXG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gIC8vIGhvdyBtYW55IGZyYW1lcyBzbGlkZXIgaGFzIGJlZW4gaW4gc2FtZSBwb3NpdGlvblxuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICAvLyBpbml0aWFsIHBoeXNpY3MgcHJvcGVydGllc1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgdGhpcy5vcmlnaW5TaWRlID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgLy8gY3JlYXRlIHZpZXdwb3J0ICYgc2xpZGVyXG4gIHRoaXMudmlld3BvcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGhpcy52aWV3cG9ydC5jbGFzc05hbWUgPSAnZmxpY2tpdHktdmlld3BvcnQnO1xuICB0aGlzLl9jcmVhdGVTbGlkZXIoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5yZXNpemUgfHwgdGhpcy5vcHRpb25zLndhdGNoQ1NTICkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB9XG5cbiAgLy8gYWRkIGxpc3RlbmVycyBmcm9tIG9uIG9wdGlvblxuICBmb3IgKCB2YXIgZXZlbnROYW1lIGluIHRoaXMub3B0aW9ucy5vbiApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLm9wdGlvbnMub25bIGV2ZW50TmFtZSBdO1xuICAgIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgfVxuXG4gIEZsaWNraXR5LmNyZWF0ZU1ldGhvZHMuZm9yRWFjaCggZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICB0aGlzWyBtZXRob2QgXSgpO1xuICB9LCB0aGlzICk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMud2F0Y2hDU1MgKSB7XG4gICAgdGhpcy53YXRjaENTUygpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG59O1xuXG4vKipcbiAqIHNldCBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICovXG5wcm90by5vcHRpb24gPSBmdW5jdGlvbiggb3B0cyApIHtcbiAgdXRpbHMuZXh0ZW5kKCB0aGlzLm9wdGlvbnMsIG9wdHMgKTtcbn07XG5cbnByb3RvLmFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5pc0FjdGl2ZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGlja2l0eS1lbmFibGVkJyk7XG4gIGlmICggdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ICkge1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGlja2l0eS1ydGwnKTtcbiAgfVxuXG4gIHRoaXMuZ2V0U2l6ZSgpO1xuICAvLyBtb3ZlIGluaXRpYWwgY2VsbCBlbGVtZW50cyBzbyB0aGV5IGNhbiBiZSBsb2FkZWQgYXMgY2VsbHNcbiAgdmFyIGNlbGxFbGVtcyA9IHRoaXMuX2ZpbHRlckZpbmRDZWxsRWxlbWVudHMoIHRoaXMuZWxlbWVudC5jaGlsZHJlbiApO1xuICBtb3ZlRWxlbWVudHMoIGNlbGxFbGVtcywgdGhpcy5zbGlkZXIgKTtcbiAgdGhpcy52aWV3cG9ydC5hcHBlbmRDaGlsZCggdGhpcy5zbGlkZXIgKTtcbiAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLnZpZXdwb3J0ICk7XG4gIC8vIGdldCBjZWxscyBmcm9tIGNoaWxkcmVuXG4gIHRoaXMucmVsb2FkQ2VsbHMoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ICkge1xuICAgIC8vIGFsbG93IGVsZW1lbnQgdG8gZm9jdXNhYmxlXG4gICAgdGhpcy5lbGVtZW50LnRhYkluZGV4ID0gMDtcbiAgICAvLyBsaXN0ZW4gZm9yIGtleSBwcmVzc2VzXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgdGhpcyApO1xuICB9XG5cbiAgdGhpcy5lbWl0RXZlbnQoJ2FjdGl2YXRlJyk7XG4gIHRoaXMuc2VsZWN0SW5pdGlhbEluZGV4KCk7XG4gIC8vIGZsYWcgZm9yIGluaXRpYWwgYWN0aXZhdGlvbiwgZm9yIHVzaW5nIGluaXRpYWxJbmRleFxuICB0aGlzLmlzSW5pdEFjdGl2YXRlZCA9IHRydWU7XG4gIC8vIHJlYWR5IGV2ZW50LiAjNDkzXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCgncmVhZHknKTtcbn07XG5cbi8vIHNsaWRlciBwb3NpdGlvbnMgdGhlIGNlbGxzXG5wcm90by5fY3JlYXRlU2xpZGVyID0gZnVuY3Rpb24oKSB7XG4gIC8vIHNsaWRlciBlbGVtZW50IGRvZXMgYWxsIHRoZSBwb3NpdGlvbmluZ1xuICB2YXIgc2xpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHNsaWRlci5jbGFzc05hbWUgPSAnZmxpY2tpdHktc2xpZGVyJztcbiAgc2xpZGVyLnN0eWxlWyB0aGlzLm9yaWdpblNpZGUgXSA9IDA7XG4gIHRoaXMuc2xpZGVyID0gc2xpZGVyO1xufTtcblxucHJvdG8uX2ZpbHRlckZpbmRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHJldHVybiB1dGlscy5maWx0ZXJGaW5kRWxlbWVudHMoIGVsZW1zLCB0aGlzLm9wdGlvbnMuY2VsbFNlbGVjdG9yICk7XG59O1xuXG4vLyBnb2VzIHRocm91Z2ggYWxsIGNoaWxkcmVuXG5wcm90by5yZWxvYWRDZWxscyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAgdGhpcy5jZWxscyA9IHRoaXMuX21ha2VDZWxscyggdGhpcy5zbGlkZXIuY2hpbGRyZW4gKTtcbiAgdGhpcy5wb3NpdGlvbkNlbGxzKCk7XG4gIHRoaXMuX2dldFdyYXBTaGlmdENlbGxzKCk7XG4gIHRoaXMuc2V0R2FsbGVyeVNpemUoKTtcbn07XG5cbi8qKlxuICogdHVybiBlbGVtZW50cyBpbnRvIEZsaWNraXR5LkNlbGxzXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IEZsaWNraXR5IENlbGxzXG4gKi9cbnByb3RvLl9tYWtlQ2VsbHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBjZWxsRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kQ2VsbEVsZW1lbnRzKCBlbGVtcyApO1xuXG4gIC8vIGNyZWF0ZSBuZXcgRmxpY2tpdHkgZm9yIGNvbGxlY3Rpb25cbiAgdmFyIGNlbGxzID0gY2VsbEVsZW1zLm1hcCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHJldHVybiBuZXcgQ2VsbCggY2VsbEVsZW0sIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBjZWxscztcbn07XG5cbnByb3RvLmdldExhc3RDZWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzWyB0aGlzLmNlbGxzLmxlbmd0aCAtIDEgXTtcbn07XG5cbnByb3RvLmdldExhc3RTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkZXNbIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEgXTtcbn07XG5cbi8vIHBvc2l0aW9ucyBhbGwgY2VsbHNcbnByb3RvLnBvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2l6ZSBhbGwgY2VsbHNcbiAgdGhpcy5fc2l6ZUNlbGxzKCB0aGlzLmNlbGxzICk7XG4gIC8vIHBvc2l0aW9uIGFsbCBjZWxsc1xuICB0aGlzLl9wb3NpdGlvbkNlbGxzKCAwICk7XG59O1xuXG4vKipcbiAqIHBvc2l0aW9uIGNlcnRhaW4gY2VsbHNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSB3aGljaCBjZWxsIHRvIHN0YXJ0IHdpdGhcbiAqL1xucHJvdG8uX3Bvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbiggaW5kZXggKSB7XG4gIGluZGV4ID0gaW5kZXggfHwgMDtcbiAgLy8gYWxzbyBtZWFzdXJlIG1heENlbGxIZWlnaHRcbiAgLy8gc3RhcnQgMCBpZiBwb3NpdGlvbmluZyBhbGwgY2VsbHNcbiAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gaW5kZXggPyB0aGlzLm1heENlbGxIZWlnaHQgfHwgMCA6IDA7XG4gIHZhciBjZWxsWCA9IDA7XG4gIC8vIGdldCBjZWxsWFxuICBpZiAoIGluZGV4ID4gMCApIHtcbiAgICB2YXIgc3RhcnRDZWxsID0gdGhpcy5jZWxsc1sgaW5kZXggLSAxIF07XG4gICAgY2VsbFggPSBzdGFydENlbGwueCArIHN0YXJ0Q2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbiAgdmFyIGxlbiA9IHRoaXMuY2VsbHMubGVuZ3RoO1xuICBmb3IgKCB2YXIgaT1pbmRleDsgaSA8IGxlbjsgaSsrICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5jZWxsc1tpXTtcbiAgICBjZWxsLnNldFBvc2l0aW9uKCBjZWxsWCApO1xuICAgIGNlbGxYICs9IGNlbGwuc2l6ZS5vdXRlcldpZHRoO1xuICAgIHRoaXMubWF4Q2VsbEhlaWdodCA9IE1hdGgubWF4KCBjZWxsLnNpemUub3V0ZXJIZWlnaHQsIHRoaXMubWF4Q2VsbEhlaWdodCApO1xuICB9XG4gIC8vIGtlZXAgdHJhY2sgb2YgY2VsbFggZm9yIHdyYXAtYXJvdW5kXG4gIHRoaXMuc2xpZGVhYmxlV2lkdGggPSBjZWxsWDtcbiAgLy8gc2xpZGVzXG4gIHRoaXMudXBkYXRlU2xpZGVzKCk7XG4gIC8vIGNvbnRhaW4gc2xpZGVzIHRhcmdldFxuICB0aGlzLl9jb250YWluU2xpZGVzKCk7XG4gIC8vIHVwZGF0ZSBzbGlkZXNXaWR0aFxuICB0aGlzLnNsaWRlc1dpZHRoID0gbGVuID8gdGhpcy5nZXRMYXN0U2xpZGUoKS50YXJnZXQgLSB0aGlzLnNsaWRlc1swXS50YXJnZXQgOiAwO1xufTtcblxuLyoqXG4gKiBjZWxsLmdldFNpemUoKSBvbiBtdWx0aXBsZSBjZWxsc1xuICogQHBhcmFtIHtBcnJheX0gY2VsbHNcbiAqL1xucHJvdG8uX3NpemVDZWxscyA9IGZ1bmN0aW9uKCBjZWxscyApIHtcbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5nZXRTaXplKCk7XG4gIH0pO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLnVwZGF0ZVNsaWRlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNsaWRlcyA9IFtdO1xuICBpZiAoICF0aGlzLmNlbGxzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2xpZGUgPSBuZXcgU2xpZGUoIHRoaXMgKTtcbiAgdGhpcy5zbGlkZXMucHVzaCggc2xpZGUgKTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMub3JpZ2luU2lkZSA9PSAnbGVmdCc7XG4gIHZhciBuZXh0TWFyZ2luID0gaXNPcmlnaW5MZWZ0ID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcblxuICB2YXIgY2FuQ2VsbEZpdCA9IHRoaXMuX2dldENhbkNlbGxGaXQoKTtcblxuICB0aGlzLmNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsLCBpICkge1xuICAgIC8vIGp1c3QgYWRkIGNlbGwgaWYgZmlyc3QgY2VsbCBpbiBzbGlkZVxuICAgIGlmICggIXNsaWRlLmNlbGxzLmxlbmd0aCApIHtcbiAgICAgIHNsaWRlLmFkZENlbGwoIGNlbGwgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2xpZGVXaWR0aCA9ICggc2xpZGUub3V0ZXJXaWR0aCAtIHNsaWRlLmZpcnN0TWFyZ2luICkgK1xuICAgICAgKCBjZWxsLnNpemUub3V0ZXJXaWR0aCAtIGNlbGwuc2l6ZVsgbmV4dE1hcmdpbiBdICk7XG5cbiAgICBpZiAoIGNhbkNlbGxGaXQuY2FsbCggdGhpcywgaSwgc2xpZGVXaWR0aCApICkge1xuICAgICAgc2xpZGUuYWRkQ2VsbCggY2VsbCApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkb2Vzbid0IGZpdCwgbmV3IHNsaWRlXG4gICAgICBzbGlkZS51cGRhdGVUYXJnZXQoKTtcblxuICAgICAgc2xpZGUgPSBuZXcgU2xpZGUoIHRoaXMgKTtcbiAgICAgIHRoaXMuc2xpZGVzLnB1c2goIHNsaWRlICk7XG4gICAgICBzbGlkZS5hZGRDZWxsKCBjZWxsICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG4gIC8vIGxhc3Qgc2xpZGVcbiAgc2xpZGUudXBkYXRlVGFyZ2V0KCk7XG4gIC8vIHVwZGF0ZSAuc2VsZWN0ZWRTbGlkZVxuICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2xpZGUoKTtcbn07XG5cbnByb3RvLl9nZXRDYW5DZWxsRml0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBncm91cENlbGxzID0gdGhpcy5vcHRpb25zLmdyb3VwQ2VsbHM7XG4gIGlmICggIWdyb3VwQ2VsbHMgKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBncm91cENlbGxzID09ICdudW1iZXInICkge1xuICAgIC8vIGdyb3VwIGJ5IG51bWJlci4gMyAtPiBbMCwxLDJdLCBbMyw0LDVdLCAuLi5cbiAgICB2YXIgbnVtYmVyID0gcGFyc2VJbnQoIGdyb3VwQ2VsbHMsIDEwICk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCBpICkge1xuICAgICAgcmV0dXJuICggaSAlIG51bWJlciApICE9PSAwO1xuICAgIH07XG4gIH1cbiAgLy8gZGVmYXVsdCwgZ3JvdXAgYnkgd2lkdGggb2Ygc2xpZGVcbiAgLy8gcGFyc2UgJzc1JVxuICB2YXIgcGVyY2VudE1hdGNoID0gdHlwZW9mIGdyb3VwQ2VsbHMgPT0gJ3N0cmluZycgJiZcbiAgICBncm91cENlbGxzLm1hdGNoKC9eKFxcZCspJSQvKTtcbiAgdmFyIHBlcmNlbnQgPSBwZXJjZW50TWF0Y2ggPyBwYXJzZUludCggcGVyY2VudE1hdGNoWzFdLCAxMCApIC8gMTAwIDogMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCBpLCBzbGlkZVdpZHRoICkge1xuICAgIHJldHVybiBzbGlkZVdpZHRoIDw9ICggdGhpcy5zaXplLmlubmVyV2lkdGggKyAxICkgKiBwZXJjZW50O1xuICB9O1xufTtcblxuLy8gYWxpYXMgX2luaXQgZm9yIGpRdWVyeSBwbHVnaW4gLmZsaWNraXR5KClcbnByb3RvLl9pbml0ID1cbnByb3RvLnJlcG9zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wb3NpdGlvbkNlbGxzKCk7XG4gIHRoaXMucG9zaXRpb25TbGlkZXJBdFNlbGVjdGVkKCk7XG59O1xuXG5wcm90by5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xuICB0aGlzLnNldENlbGxBbGlnbigpO1xuICB0aGlzLmN1cnNvclBvc2l0aW9uID0gdGhpcy5zaXplLmlubmVyV2lkdGggKiB0aGlzLmNlbGxBbGlnbjtcbn07XG5cbnZhciBjZWxsQWxpZ25TaG9ydGhhbmRzID0ge1xuICAvLyBjZWxsIGFsaWduLCB0aGVuIGJhc2VkIG9uIG9yaWdpbiBzaWRlXG4gIGNlbnRlcjoge1xuICAgIGxlZnQ6IDAuNSxcbiAgICByaWdodDogMC41XG4gIH0sXG4gIGxlZnQ6IHtcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAxXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMVxuICB9XG59O1xuXG5wcm90by5zZXRDZWxsQWxpZ24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNob3J0aGFuZCA9IGNlbGxBbGlnblNob3J0aGFuZHNbIHRoaXMub3B0aW9ucy5jZWxsQWxpZ24gXTtcbiAgdGhpcy5jZWxsQWxpZ24gPSBzaG9ydGhhbmQgPyBzaG9ydGhhbmRbIHRoaXMub3JpZ2luU2lkZSBdIDogdGhpcy5vcHRpb25zLmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLnNldEdhbGxlcnlTaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5vcHRpb25zLnNldEdhbGxlcnlTaXplICkge1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLm9wdGlvbnMuYWRhcHRpdmVIZWlnaHQgJiYgdGhpcy5zZWxlY3RlZFNsaWRlID9cbiAgICAgIHRoaXMuc2VsZWN0ZWRTbGlkZS5oZWlnaHQgOiB0aGlzLm1heENlbGxIZWlnaHQ7XG4gICAgdGhpcy52aWV3cG9ydC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICB9XG59O1xuXG5wcm90by5fZ2V0V3JhcFNoaWZ0Q2VsbHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gb25seSBmb3Igd3JhcC1hcm91bmRcbiAgaWYgKCAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHVuc2hpZnQgcHJldmlvdXMgY2VsbHNcbiAgdGhpcy5fdW5zaGlmdENlbGxzKCB0aGlzLmJlZm9yZVNoaWZ0Q2VsbHMgKTtcbiAgdGhpcy5fdW5zaGlmdENlbGxzKCB0aGlzLmFmdGVyU2hpZnRDZWxscyApO1xuICAvLyBnZXQgYmVmb3JlIGNlbGxzXG4gIC8vIGluaXRpYWwgZ2FwXG4gIHZhciBnYXBYID0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgdmFyIGNlbGxJbmRleCA9IHRoaXMuY2VsbHMubGVuZ3RoIC0gMTtcbiAgdGhpcy5iZWZvcmVTaGlmdENlbGxzID0gdGhpcy5fZ2V0R2FwQ2VsbHMoIGdhcFgsIGNlbGxJbmRleCwgLTEgKTtcbiAgLy8gZ2V0IGFmdGVyIGNlbGxzXG4gIC8vIGVuZGluZyBnYXAgYmV0d2VlbiBsYXN0IGNlbGwgYW5kIGVuZCBvZiBnYWxsZXJ5IHZpZXdwb3J0XG4gIGdhcFggPSB0aGlzLnNpemUuaW5uZXJXaWR0aCAtIHRoaXMuY3Vyc29yUG9zaXRpb247XG4gIC8vIHN0YXJ0IGNsb25pbmcgYXQgZmlyc3QgY2VsbCwgd29ya2luZyBmb3J3YXJkc1xuICB0aGlzLmFmdGVyU2hpZnRDZWxscyA9IHRoaXMuX2dldEdhcENlbGxzKCBnYXBYLCAwLCAxICk7XG59O1xuXG5wcm90by5fZ2V0R2FwQ2VsbHMgPSBmdW5jdGlvbiggZ2FwWCwgY2VsbEluZGV4LCBpbmNyZW1lbnQgKSB7XG4gIC8vIGtlZXAgYWRkaW5nIGNlbGxzIHVudGlsIHRoZSBjb3ZlciB0aGUgaW5pdGlhbCBnYXBcbiAgdmFyIGNlbGxzID0gW107XG4gIHdoaWxlICggZ2FwWCA+IDAgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzWyBjZWxsSW5kZXggXTtcbiAgICBpZiAoICFjZWxsICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNlbGxzLnB1c2goIGNlbGwgKTtcbiAgICBjZWxsSW5kZXggKz0gaW5jcmVtZW50O1xuICAgIGdhcFggLT0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbiAgcmV0dXJuIGNlbGxzO1xufTtcblxuLy8gLS0tLS0gY29udGFpbiAtLS0tLSAvL1xuXG4vLyBjb250YWluIGNlbGwgdGFyZ2V0cyBzbyBubyBleGNlc3Mgc2xpZGluZ1xucHJvdG8uX2NvbnRhaW5TbGlkZXMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLmNvbnRhaW4gfHwgdGhpcy5vcHRpb25zLndyYXBBcm91bmQgfHwgIXRoaXMuY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaXNSaWdodFRvTGVmdCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdDtcbiAgdmFyIGJlZ2luTWFyZ2luID0gaXNSaWdodFRvTGVmdCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCc7XG4gIHZhciBlbmRNYXJnaW4gPSBpc1JpZ2h0VG9MZWZ0ID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgdmFyIGNvbnRlbnRXaWR0aCA9IHRoaXMuc2xpZGVhYmxlV2lkdGggLSB0aGlzLmdldExhc3RDZWxsKCkuc2l6ZVsgZW5kTWFyZ2luIF07XG4gIC8vIGNvbnRlbnQgaXMgbGVzcyB0aGFuIGdhbGxlcnkgc2l6ZVxuICB2YXIgaXNDb250ZW50U21hbGxlciA9IGNvbnRlbnRXaWR0aCA8IHRoaXMuc2l6ZS5pbm5lcldpZHRoO1xuICAvLyBib3VuZHNcbiAgdmFyIGJlZ2luQm91bmQgPSB0aGlzLmN1cnNvclBvc2l0aW9uICsgdGhpcy5jZWxsc1swXS5zaXplWyBiZWdpbk1hcmdpbiBdO1xuICB2YXIgZW5kQm91bmQgPSBjb250ZW50V2lkdGggLSB0aGlzLnNpemUuaW5uZXJXaWR0aCAqICggMSAtIHRoaXMuY2VsbEFsaWduICk7XG4gIC8vIGNvbnRhaW4gZWFjaCBjZWxsIHRhcmdldFxuICB0aGlzLnNsaWRlcy5mb3JFYWNoKCBmdW5jdGlvbiggc2xpZGUgKSB7XG4gICAgaWYgKCBpc0NvbnRlbnRTbWFsbGVyICkge1xuICAgICAgLy8gYWxsIGNlbGxzIGZpdCBpbnNpZGUgZ2FsbGVyeVxuICAgICAgc2xpZGUudGFyZ2V0ID0gY29udGVudFdpZHRoICogdGhpcy5jZWxsQWxpZ247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnRhaW4gdG8gYm91bmRzXG4gICAgICBzbGlkZS50YXJnZXQgPSBNYXRoLm1heCggc2xpZGUudGFyZ2V0LCBiZWdpbkJvdW5kICk7XG4gICAgICBzbGlkZS50YXJnZXQgPSBNYXRoLm1pbiggc2xpZGUudGFyZ2V0LCBlbmRCb3VuZCApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbi8qKlxuICogZW1pdHMgZXZlbnRzIHZpYSBldmVudEVtaXR0ZXIgYW5kIGpRdWVyeSBldmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBvcmlnaW5hbCBldmVudFxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGV4dHJhIGFyZ3VtZW50c1xuICovXG5wcm90by5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBhcmdzICkge1xuICB2YXIgZW1pdEFyZ3MgPSBldmVudCA/IFsgZXZlbnQgXS5jb25jYXQoIGFyZ3MgKSA6IGFyZ3M7XG4gIHRoaXMuZW1pdEV2ZW50KCB0eXBlLCBlbWl0QXJncyApO1xuXG4gIGlmICggalF1ZXJ5ICYmIHRoaXMuJGVsZW1lbnQgKSB7XG4gICAgLy8gZGVmYXVsdCB0cmlnZ2VyIHdpdGggdHlwZSBpZiBubyBldmVudFxuICAgIHR5cGUgKz0gdGhpcy5vcHRpb25zLm5hbWVzcGFjZUpRdWVyeUV2ZW50cyA/ICcuZmxpY2tpdHknIDogJyc7XG4gICAgdmFyICRldmVudCA9IHR5cGU7XG4gICAgaWYgKCBldmVudCApIHtcbiAgICAgIC8vIGNyZWF0ZSBqUXVlcnkgZXZlbnRcbiAgICAgIHZhciBqUUV2ZW50ID0galF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgalFFdmVudC50eXBlID0gdHlwZTtcbiAgICAgICRldmVudCA9IGpRRXZlbnQ7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlbGVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgc2xpZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXcmFwIC0gd2lsbCB3cmFwLWFyb3VuZCB0byBsYXN0L2ZpcnN0IGlmIGF0IHRoZSBlbmRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gd2lsbCBpbW1lZGlhdGVseSBzZXQgcG9zaXRpb24gYXQgc2VsZWN0ZWQgY2VsbFxuICovXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbiggaW5kZXgsIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICBpZiAoICF0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbmRleCA9IHBhcnNlSW50KCBpbmRleCwgMTAgKTtcbiAgdGhpcy5fd3JhcFNlbGVjdCggaW5kZXggKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kIHx8IGlzV3JhcCApIHtcbiAgICBpbmRleCA9IHV0aWxzLm1vZHVsbyggaW5kZXgsIHRoaXMuc2xpZGVzLmxlbmd0aCApO1xuICB9XG4gIC8vIGJhaWwgaWYgaW52YWxpZCBpbmRleFxuICBpZiAoICF0aGlzLnNsaWRlc1sgaW5kZXggXSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHByZXZJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gIHRoaXMudXBkYXRlU2VsZWN0ZWRTbGlkZSgpO1xuICBpZiAoIGlzSW5zdGFudCApIHtcbiAgICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCApIHtcbiAgICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIH1cbiAgLy8gZXZlbnRzXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3NlbGVjdCcsIG51bGwsIFsgaW5kZXggXSApO1xuICAvLyBjaGFuZ2UgZXZlbnQgaWYgbmV3IGluZGV4XG4gIGlmICggaW5kZXggIT0gcHJldkluZGV4ICkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2NoYW5nZScsIG51bGwsIFsgaW5kZXggXSApO1xuICB9XG4gIC8vIG9sZCB2MSBldmVudCBuYW1lLCByZW1vdmUgaW4gdjNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjZWxsU2VsZWN0Jyk7XG59O1xuXG4vLyB3cmFwcyBwb3NpdGlvbiBmb3Igd3JhcEFyb3VuZCwgdG8gbW92ZSB0byBjbG9zZXN0IHNsaWRlLiAjMTEzXG5wcm90by5fd3JhcFNlbGVjdCA9IGZ1bmN0aW9uKCBpbmRleCApIHtcbiAgdmFyIGxlbiA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgdmFyIGlzV3JhcHBpbmcgPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiBsZW4gPiAxO1xuICBpZiAoICFpc1dyYXBwaW5nICkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICB2YXIgd3JhcEluZGV4ID0gdXRpbHMubW9kdWxvKCBpbmRleCwgbGVuICk7XG4gIC8vIGdvIHRvIHNob3J0ZXN0XG4gIHZhciBkZWx0YSA9IE1hdGguYWJzKCB3cmFwSW5kZXggLSB0aGlzLnNlbGVjdGVkSW5kZXggKTtcbiAgdmFyIGJhY2tXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggKyBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICB2YXIgZm9yZXdhcmRXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggLSBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICBpZiAoICF0aGlzLmlzRHJhZ1NlbGVjdCAmJiBiYWNrV3JhcERlbHRhIDwgZGVsdGEgKSB7XG4gICAgaW5kZXggKz0gbGVuO1xuICB9IGVsc2UgaWYgKCAhdGhpcy5pc0RyYWdTZWxlY3QgJiYgZm9yZXdhcmRXcmFwRGVsdGEgPCBkZWx0YSApIHtcbiAgICBpbmRleCAtPSBsZW47XG4gIH1cbiAgLy8gd3JhcCBwb3NpdGlvbiBzbyBzbGlkZXIgaXMgd2l0aGluIG5vcm1hbCBhcmVhXG4gIGlmICggaW5kZXggPCAwICkge1xuICAgIHRoaXMueCAtPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9IGVsc2UgaWYgKCBpbmRleCA+PSBsZW4gKSB7XG4gICAgdGhpcy54ICs9IHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLnByZXZpb3VzID0gZnVuY3Rpb24oIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICB0aGlzLnNlbGVjdCggdGhpcy5zZWxlY3RlZEluZGV4IC0gMSwgaXNXcmFwLCBpc0luc3RhbnQgKTtcbn07XG5cbnByb3RvLm5leHQgPSBmdW5jdGlvbiggaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXggKyAxLCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8udXBkYXRlU2VsZWN0ZWRTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgdGhpcy5zZWxlY3RlZEluZGV4IF07XG4gIC8vIHNlbGVjdGVkSW5kZXggY291bGQgYmUgb3V0c2lkZSBvZiBzbGlkZXMsIGlmIHRyaWdnZXJlZCBiZWZvcmUgcmVzaXplKClcbiAgaWYgKCAhc2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGVkIHNsaWRlXG4gIHRoaXMudW5zZWxlY3RTZWxlY3RlZFNsaWRlKCk7XG4gIC8vIHVwZGF0ZSBuZXcgc2VsZWN0ZWQgc2xpZGVcbiAgdGhpcy5zZWxlY3RlZFNsaWRlID0gc2xpZGU7XG4gIHNsaWRlLnNlbGVjdCgpO1xuICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBzbGlkZS5jZWxscztcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gc2xpZGUuZ2V0Q2VsbEVsZW1lbnRzKCk7XG4gIC8vIEhBQ0s6IHNlbGVjdGVkQ2VsbCAmIHNlbGVjdGVkRWxlbWVudCBpcyBmaXJzdCBjZWxsIGluIHNsaWRlLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAvLyBSZW1vdmUgaW4gdjM/XG4gIHRoaXMuc2VsZWN0ZWRDZWxsID0gc2xpZGUuY2VsbHNbMF07XG4gIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xufTtcblxucHJvdG8udW5zZWxlY3RTZWxlY3RlZFNsaWRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5zZWxlY3RlZFNsaWRlICkge1xuICAgIHRoaXMuc2VsZWN0ZWRTbGlkZS51bnNlbGVjdCgpO1xuICB9XG59O1xuXG5wcm90by5zZWxlY3RJbml0aWFsSW5kZXggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMub3B0aW9ucy5pbml0aWFsSW5kZXg7XG4gIC8vIGFscmVhZHkgYWN0aXZhdGVkLCBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWRJbmRleFxuICBpZiAoIHRoaXMuaXNJbml0QWN0aXZhdGVkICkge1xuICAgIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXgsIGZhbHNlLCB0cnVlICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHNlbGVjdCB3aXRoIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0eXBlb2YgaW5pdGlhbEluZGV4ID09ICdzdHJpbmcnICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5xdWVyeUNlbGwoIGluaXRpYWxJbmRleCApO1xuICAgIGlmICggY2VsbCApIHtcbiAgICAgIHRoaXMuc2VsZWN0Q2VsbCggaW5pdGlhbEluZGV4LCBmYWxzZSwgdHJ1ZSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIHNlbGVjdCB3aXRoIG51bWJlclxuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0aGlzLnNsaWRlc1sgaW5pdGlhbEluZGV4IF0gKSB7XG4gICAgaW5kZXggPSBpbml0aWFsSW5kZXg7XG4gIH1cbiAgLy8gc2VsZWN0IGluc3RhbnRseVxuICB0aGlzLnNlbGVjdCggaW5kZXgsIGZhbHNlLCB0cnVlICk7XG59O1xuXG4vKipcbiAqIHNlbGVjdCBzbGlkZSBmcm9tIG51bWJlciBvciBjZWxsIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudCBvciBOdW1iZXJ9IGVsZW1cbiAqL1xucHJvdG8uc2VsZWN0Q2VsbCA9IGZ1bmN0aW9uKCB2YWx1ZSwgaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIC8vIGdldCBjZWxsXG4gIHZhciBjZWxsID0gdGhpcy5xdWVyeUNlbGwoIHZhbHVlICk7XG4gIGlmICggIWNlbGwgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gdGhpcy5nZXRDZWxsU2xpZGVJbmRleCggY2VsbCApO1xuICB0aGlzLnNlbGVjdCggaW5kZXgsIGlzV3JhcCwgaXNJbnN0YW50ICk7XG59O1xuXG5wcm90by5nZXRDZWxsU2xpZGVJbmRleCA9IGZ1bmN0aW9uKCBjZWxsICkge1xuICAvLyBnZXQgaW5kZXggb2Ygc2xpZGVzIHRoYXQgaGFzIGNlbGxcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuc2xpZGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2ldO1xuICAgIHZhciBpbmRleCA9IHNsaWRlLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXQgY2VsbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgRmxpY2tpdHkuQ2VsbCwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7RmxpY2tpdHkuQ2VsbH0gaXRlbVxuICovXG5wcm90by5nZXRDZWxsID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIC8vIGxvb3AgdGhyb3VnaCBjZWxscyB0byBnZXQgdGhlIG9uZSB0aGF0IG1hdGNoZXNcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGlmICggY2VsbC5lbGVtZW50ID09IGVsZW0gKSB7XG4gICAgICByZXR1cm4gY2VsbDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgRmxpY2tpdHkuQ2VsbHMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gY2VsbHMgLSBGbGlja2l0eS5DZWxsc1xuICovXG5wcm90by5nZXRDZWxscyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBjZWxscyA9IFtdO1xuICBlbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbSApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xuICAgIGlmICggY2VsbCApIHtcbiAgICAgIGNlbGxzLnB1c2goIGNlbGwgKTtcbiAgICB9XG4gIH0sIHRoaXMgKTtcbiAgcmV0dXJuIGNlbGxzO1xufTtcblxuLyoqXG4gKiBnZXQgY2VsbCBlbGVtZW50c1xuICogQHJldHVybnMge0FycmF5fSBjZWxsRWxlbXNcbiAqL1xucHJvdG8uZ2V0Q2VsbEVsZW1lbnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzLm1hcCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgcmV0dXJuIGNlbGwuZWxlbWVudDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGdldCBwYXJlbnQgY2VsbCBmcm9tIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge0ZsaWNraXQuQ2VsbH0gY2VsbFxuICovXG5wcm90by5nZXRQYXJlbnRDZWxsID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIC8vIGZpcnN0IGNoZWNrIGlmIGVsZW0gaXMgY2VsbFxuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xuICBpZiAoIGNlbGwgKSB7XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cbiAgLy8gdHJ5IHRvIGdldCBwYXJlbnQgY2VsbCBlbGVtXG4gIGVsZW0gPSB1dGlscy5nZXRQYXJlbnQoIGVsZW0sICcuZmxpY2tpdHktc2xpZGVyID4gKicgKTtcbiAgcmV0dXJuIHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xufTtcblxuLyoqXG4gKiBnZXQgY2VsbHMgYWRqYWNlbnQgdG8gYSBzbGlkZVxuICogQHBhcmFtIHtJbnRlZ2VyfSBhZGpDb3VudCAtIG51bWJlciBvZiBhZGphY2VudCBzbGlkZXNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBpbmRleCBvZiBzbGlkZSB0byBzdGFydFxuICogQHJldHVybnMge0FycmF5fSBjZWxscyAtIGFycmF5IG9mIEZsaWNraXR5LkNlbGxzXG4gKi9cbnByb3RvLmdldEFkamFjZW50Q2VsbEVsZW1lbnRzID0gZnVuY3Rpb24oIGFkakNvdW50LCBpbmRleCApIHtcbiAgaWYgKCAhYWRqQ291bnQgKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTbGlkZS5nZXRDZWxsRWxlbWVudHMoKTtcbiAgfVxuICBpbmRleCA9IGluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLnNlbGVjdGVkSW5kZXggOiBpbmRleDtcblxuICB2YXIgbGVuID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICBpZiAoIDEgKyAoIGFkakNvdW50ICogMiApID49IGxlbiApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsRWxlbWVudHMoKTtcbiAgfVxuXG4gIHZhciBjZWxsRWxlbXMgPSBbXTtcbiAgZm9yICggdmFyIGkgPSBpbmRleCAtIGFkakNvdW50OyBpIDw9IGluZGV4ICsgYWRqQ291bnQgOyBpKysgKSB7XG4gICAgdmFyIHNsaWRlSW5kZXggPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCA/IHV0aWxzLm1vZHVsbyggaSwgbGVuICkgOiBpO1xuICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzWyBzbGlkZUluZGV4IF07XG4gICAgaWYgKCBzbGlkZSApIHtcbiAgICAgIGNlbGxFbGVtcyA9IGNlbGxFbGVtcy5jb25jYXQoIHNsaWRlLmdldENlbGxFbGVtZW50cygpICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjZWxsRWxlbXM7XG59O1xuXG4vKipcbiAqIHNlbGVjdCBzbGlkZSBmcm9tIG51bWJlciBvciBjZWxsIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudCwgU2VsZWN0b3IgU3RyaW5nLCBvciBOdW1iZXJ9IHNlbGVjdG9yXG4gKi9cbnByb3RvLnF1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcbiAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT0gJ251bWJlcicgKSB7XG4gICAgLy8gdXNlIG51bWJlciBhcyBpbmRleFxuICAgIHJldHVybiB0aGlzLmNlbGxzWyBzZWxlY3RvciBdO1xuICB9XG4gIGlmICggdHlwZW9mIHNlbGVjdG9yID09ICdzdHJpbmcnICkge1xuICAgIC8vIGRvIG5vdCBzZWxlY3QgaW52YWxpZCBzZWxlY3RvcnMgZnJvbSBoYXNoOiAjMTIzLCAjLy4gIzc5MVxuICAgIGlmICggc2VsZWN0b3IubWF0Y2goL15bI1xcLl0/W1xcZFxcL10vKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gdXNlIHN0cmluZyBhcyBzZWxlY3RvciwgZ2V0IGVsZW1lbnRcbiAgICBzZWxlY3RvciA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICB9XG4gIC8vIGdldCBjZWxsIGZyb20gZWxlbWVudFxuICByZXR1cm4gdGhpcy5nZXRDZWxsKCBzZWxlY3RvciApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXZlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLnVpQ2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCd1aUNoYW5nZScpO1xufTtcblxuLy8ga2VlcCBmb2N1cyBvbiBlbGVtZW50IHdoZW4gY2hpbGQgVUkgZWxlbWVudHMgYXJlIGNsaWNrZWRcbnByb3RvLmNoaWxkVUlQb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gSEFDSyBpT1MgZG9lcyBub3QgYWxsb3cgdG91Y2ggZXZlbnRzIHRvIGJ1YmJsZSB1cD8hXG4gIGlmICggZXZlbnQudHlwZSAhPSAndG91Y2hzdGFydCcgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICB0aGlzLmZvY3VzKCk7XG59O1xuXG4vLyAtLS0tLSByZXNpemUgLS0tLS0gLy9cblxucHJvdG8ub25yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy53YXRjaENTUygpO1xuICB0aGlzLnJlc2l6ZSgpO1xufTtcblxudXRpbHMuZGVib3VuY2VNZXRob2QoIEZsaWNraXR5LCAnb25yZXNpemUnLCAxNTAgKTtcblxucHJvdG8ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNBY3RpdmUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZ2V0U2l6ZSgpO1xuICAvLyB3cmFwIHZhbHVlc1xuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICkge1xuICAgIHRoaXMueCA9IHV0aWxzLm1vZHVsbyggdGhpcy54LCB0aGlzLnNsaWRlYWJsZVdpZHRoICk7XG4gIH1cbiAgdGhpcy5wb3NpdGlvbkNlbGxzKCk7XG4gIHRoaXMuX2dldFdyYXBTaGlmdENlbGxzKCk7XG4gIHRoaXMuc2V0R2FsbGVyeVNpemUoKTtcbiAgdGhpcy5lbWl0RXZlbnQoJ3Jlc2l6ZScpO1xuICAvLyB1cGRhdGUgc2VsZWN0ZWQgaW5kZXggZm9yIGdyb3VwIHNsaWRlcywgaW5zdGFudFxuICAvLyBUT0RPOiBwb3NpdGlvbiBjYW4gYmUgbG9zdCBiZXR3ZWVuIGdyb3VwcyBvZiB2YXJpb3VzIG51bWJlcnNcbiAgdmFyIHNlbGVjdGVkRWxlbWVudCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cyAmJiB0aGlzLnNlbGVjdGVkRWxlbWVudHNbMF07XG4gIHRoaXMuc2VsZWN0Q2VsbCggc2VsZWN0ZWRFbGVtZW50LCBmYWxzZSwgdHJ1ZSApO1xufTtcblxuLy8gd2F0Y2hlcyB0aGUgOmFmdGVyIHByb3BlcnR5LCBhY3RpdmF0ZXMvZGVhY3RpdmF0ZXNcbnByb3RvLndhdGNoQ1NTID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3YXRjaE9wdGlvbiA9IHRoaXMub3B0aW9ucy53YXRjaENTUztcbiAgaWYgKCAhd2F0Y2hPcHRpb24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFmdGVyQ29udGVudCA9IGdldENvbXB1dGVkU3R5bGUoIHRoaXMuZWxlbWVudCwgJzphZnRlcicgKS5jb250ZW50O1xuICAvLyBhY3RpdmF0ZSBpZiA6YWZ0ZXIgeyBjb250ZW50OiAnZmxpY2tpdHknIH1cbiAgaWYgKCBhZnRlckNvbnRlbnQuaW5kZXhPZignZmxpY2tpdHknKSAhPSAtMSApIHtcbiAgICB0aGlzLmFjdGl2YXRlKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGtleWRvd24gLS0tLS0gLy9cblxuLy8gZ28gcHJldmlvdXMvbmV4dCBpZiBsZWZ0L3JpZ2h0IGtleXMgcHJlc3NlZFxucHJvdG8ub25rZXlkb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBvbmx5IHdvcmsgaWYgZWxlbWVudCBpcyBpbiBmb2N1c1xuICB2YXIgaXNOb3RGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZWxlbWVudDtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgfHxpc05vdEZvY3VzZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBGbGlja2l0eS5rZXlib2FyZEhhbmRsZXJzWyBldmVudC5rZXlDb2RlIF07XG4gIGlmICggaGFuZGxlciApIHtcbiAgICBoYW5kbGVyLmNhbGwoIHRoaXMgKTtcbiAgfVxufTtcblxuRmxpY2tpdHkua2V5Ym9hcmRIYW5kbGVycyA9IHtcbiAgLy8gbGVmdCBhcnJvd1xuICAzNzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnRNZXRob2QgPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAnbmV4dCcgOiAncHJldmlvdXMnO1xuICAgIHRoaXMudWlDaGFuZ2UoKTtcbiAgICB0aGlzWyBsZWZ0TWV0aG9kIF0oKTtcbiAgfSxcbiAgLy8gcmlnaHQgYXJyb3dcbiAgMzk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByaWdodE1ldGhvZCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/ICdwcmV2aW91cycgOiAnbmV4dCc7XG4gICAgdGhpcy51aUNoYW5nZSgpO1xuICAgIHRoaXNbIHJpZ2h0TWV0aG9kIF0oKTtcbiAgfSxcbn07XG5cbi8vIC0tLS0tIGZvY3VzIC0tLS0tIC8vXG5cbnByb3RvLmZvY3VzID0gZnVuY3Rpb24oKSB7XG4gIC8vIFRPRE8gcmVtb3ZlIHNjcm9sbFRvIG9uY2UgZm9jdXMgb3B0aW9ucyBnZXRzIG1vcmUgc3VwcG9ydFxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQvZm9jdXMjQnJvd3Nlcl9jb21wYXRpYmlsaXR5XG4gIHZhciBwcmV2U2Nyb2xsWSA9IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgdGhpcy5lbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgLy8gaGFjayB0byBmaXggc2Nyb2xsIGp1bXAgYWZ0ZXIgZm9jdXMsICM3NlxuICBpZiAoIHdpbmRvdy5wYWdlWU9mZnNldCAhPSBwcmV2U2Nyb2xsWSApIHtcbiAgICB3aW5kb3cuc2Nyb2xsVG8oIHdpbmRvdy5wYWdlWE9mZnNldCwgcHJldlNjcm9sbFkgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVzdHJveSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBkZWFjdGl2YXRlIGFsbCBGbGlja2l0eSBmdW5jdGlvbmFsaXR5LCBidXQga2VlcCBzdHVmZiBhdmFpbGFibGVcbnByb3RvLmRlYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0FjdGl2ZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZsaWNraXR5LWVuYWJsZWQnKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZsaWNraXR5LXJ0bCcpO1xuICB0aGlzLnVuc2VsZWN0U2VsZWN0ZWRTbGlkZSgpO1xuICAvLyBkZXN0cm95IGNlbGxzXG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5kZXN0cm95KCk7XG4gIH0pO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQoIHRoaXMudmlld3BvcnQgKTtcbiAgLy8gbW92ZSBjaGlsZCBlbGVtZW50cyBiYWNrIGludG8gZWxlbWVudFxuICBtb3ZlRWxlbWVudHMoIHRoaXMuc2xpZGVyLmNoaWxkcmVuLCB0aGlzLmVsZW1lbnQgKTtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSApIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIHRoaXMgKTtcbiAgfVxuICAvLyBzZXQgZmxhZ3NcbiAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICB0aGlzLmVtaXRFdmVudCgnZGVhY3RpdmF0ZScpO1xufTtcblxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzICk7XG4gIHRoaXMuYWxsT2ZmKCk7XG4gIHRoaXMuZW1pdEV2ZW50KCdkZXN0cm95Jyk7XG4gIGlmICggalF1ZXJ5ICYmIHRoaXMuJGVsZW1lbnQgKSB7XG4gICAgalF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMuZWxlbWVudCwgJ2ZsaWNraXR5JyApO1xuICB9XG4gIGRlbGV0ZSB0aGlzLmVsZW1lbnQuZmxpY2tpdHlHVUlEO1xuICBkZWxldGUgaW5zdGFuY2VzWyB0aGlzLmd1aWQgXTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIHByb3RvLCBhbmltYXRlUHJvdG90eXBlICk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGV4dHJhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldCBGbGlja2l0eSBpbnN0YW5jZSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge0ZsaWNraXR5fVxuICovXG5GbGlja2l0eS5kYXRhID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGVsZW0gPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW0gKTtcbiAgdmFyIGlkID0gZWxlbSAmJiBlbGVtLmZsaWNraXR5R1VJRDtcbiAgcmV0dXJuIGlkICYmIGluc3RhbmNlc1sgaWQgXTtcbn07XG5cbnV0aWxzLmh0bWxJbml0KCBGbGlja2l0eSwgJ2ZsaWNraXR5JyApO1xuXG5pZiAoIGpRdWVyeSAmJiBqUXVlcnkuYnJpZGdldCApIHtcbiAgalF1ZXJ5LmJyaWRnZXQoICdmbGlja2l0eScsIEZsaWNraXR5ICk7XG59XG5cbi8vIHNldCBpbnRlcm5hbCBqUXVlcnksIGZvciBXZWJwYWNrICsgalF1ZXJ5IHYzLCAjNDc4XG5GbGlja2l0eS5zZXRKUXVlcnkgPSBmdW5jdGlvbigganEgKSB7XG4gIGpRdWVyeSA9IGpxO1xufTtcblxuRmxpY2tpdHkuQ2VsbCA9IENlbGw7XG5GbGlja2l0eS5TbGlkZSA9IFNsaWRlO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLDJCQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/flickity.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/index.js":
+/*!*******************************************!*\
+ !*** ./node_modules/flickity/js/index.js ***!
+ \*******************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Flickity v2.2.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2019 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n __webpack_require__(/*! ./drag */ \"./node_modules/flickity/js/drag.js\"),\n __webpack_require__(/*! ./prev-next-button */ \"./node_modules/flickity/js/prev-next-button.js\"),\n __webpack_require__(/*! ./page-dots */ \"./node_modules/flickity/js/page-dots.js\"),\n __webpack_require__(/*! ./player */ \"./node_modules/flickity/js/player.js\"),\n __webpack_require__(/*! ./add-remove-cell */ \"./node_modules/flickity/js/add-remove-cell.js\"),\n __webpack_require__(/*! ./lazyload */ \"./node_modules/flickity/js/lazyload.js\")\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n})( window, function factory( Flickity ) {\n /*jshint strict: false*/\n return Flickity;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2luZGV4LmpzPzIxN2IiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBGbGlja2l0eSB2Mi4yLjFcbiAqIFRvdWNoLCByZXNwb25zaXZlLCBmbGlja2FibGUgY2Fyb3VzZWxzXG4gKlxuICogTGljZW5zZWQgR1BMdjMgZm9yIG9wZW4gc291cmNlIHVzZVxuICogb3IgRmxpY2tpdHkgQ29tbWVyY2lhbCBMaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZVxuICpcbiAqIGh0dHBzOi8vZmxpY2tpdHkubWV0YWZpenp5LmNvXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDE5IE1ldGFmaXp6eVxuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAnLi9kcmFnJyxcbiAgICAgICcuL3ByZXYtbmV4dC1idXR0b24nLFxuICAgICAgJy4vcGFnZS1kb3RzJyxcbiAgICAgICcuL3BsYXllcicsXG4gICAgICAnLi9hZGQtcmVtb3ZlLWNlbGwnLFxuICAgICAgJy4vbGF6eWxvYWQnXG4gICAgXSwgZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgnLi9kcmFnJyksXG4gICAgICByZXF1aXJlKCcuL3ByZXYtbmV4dC1idXR0b24nKSxcbiAgICAgIHJlcXVpcmUoJy4vcGFnZS1kb3RzJyksXG4gICAgICByZXF1aXJlKCcuL3BsYXllcicpLFxuICAgICAgcmVxdWlyZSgnLi9hZGQtcmVtb3ZlLWNlbGwnKSxcbiAgICAgIHJlcXVpcmUoJy4vbGF6eWxvYWQnKVxuICAgICk7XG4gIH1cblxufSkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRmxpY2tpdHkgKSB7XG4gIC8qanNoaW50IHN0cmljdDogZmFsc2UqL1xuICByZXR1cm4gRmxpY2tpdHk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/lazyload.js":
+/*!**********************************************!*\
+ !*** ./node_modules/flickity/js/lazyload.js ***!
+ \**********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// lazyload\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n });\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvbGF6eWxvYWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2xhenlsb2FkLmpzPzhhMTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbGF6eWxvYWRcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIEZsaWNraXR5LCB1dGlscyApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgd2luZG93LmZpenp5VUlVdGlsc1xuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCB1dGlscyApIHtcbid1c2Ugc3RyaWN0JztcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlTGF6eWxvYWQnKTtcbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZUxhenlsb2FkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdzZWxlY3QnLCB0aGlzLmxhenlMb2FkICk7XG59O1xuXG5wcm90by5sYXp5TG9hZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbGF6eUxvYWQgPSB0aGlzLm9wdGlvbnMubGF6eUxvYWQ7XG4gIGlmICggIWxhenlMb2FkICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBnZXQgYWRqYWNlbnQgY2VsbHMsIHVzZSBsYXp5TG9hZCBvcHRpb24gZm9yIGFkamFjZW50IGNvdW50XG4gIHZhciBhZGpDb3VudCA9IHR5cGVvZiBsYXp5TG9hZCA9PSAnbnVtYmVyJyA/IGxhenlMb2FkIDogMDtcbiAgdmFyIGNlbGxFbGVtcyA9IHRoaXMuZ2V0QWRqYWNlbnRDZWxsRWxlbWVudHMoIGFkakNvdW50ICk7XG4gIC8vIGdldCBsYXp5IGltYWdlcyBpbiB0aG9zZSBjZWxsc1xuICB2YXIgbGF6eUltYWdlcyA9IFtdO1xuICBjZWxsRWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHZhciBsYXp5Q2VsbEltYWdlcyA9IGdldENlbGxMYXp5SW1hZ2VzKCBjZWxsRWxlbSApO1xuICAgIGxhenlJbWFnZXMgPSBsYXp5SW1hZ2VzLmNvbmNhdCggbGF6eUNlbGxJbWFnZXMgKTtcbiAgfSk7XG4gIC8vIGxvYWQgbGF6eSBpbWFnZXNcbiAgbGF6eUltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggaW1nICkge1xuICAgIG5ldyBMYXp5TG9hZGVyKCBpbWcsIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuZnVuY3Rpb24gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICkge1xuICAvLyBjaGVjayBpZiBjZWxsIGVsZW1lbnQgaXMgbGF6eSBpbWFnZVxuICBpZiAoIGNlbGxFbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHZhciBsYXp5bG9hZEF0dHIgPSBjZWxsRWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgICB2YXIgc3JjQXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmMnKTtcbiAgICB2YXIgc3Jjc2V0QXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmNzZXQnKTtcbiAgICBpZiAoIGxhenlsb2FkQXR0ciB8fCBzcmNBdHRyIHx8IHNyY3NldEF0dHIgKSB7XG4gICAgICByZXR1cm4gWyBjZWxsRWxlbSBdO1xuICAgIH1cbiAgfVxuICAvLyBzZWxlY3QgbGF6eSBpbWFnZXMgaW4gY2VsbFxuICB2YXIgbGF6eVNlbGVjdG9yID0gJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkXSwgJyArXG4gICAgJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY10sIGltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY3NldF0nO1xuICB2YXIgaW1ncyA9IGNlbGxFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIGxhenlTZWxlY3RvciApO1xuICByZXR1cm4gdXRpbHMubWFrZUFycmF5KCBpbWdzICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExhenlMb2FkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBjbGFzcyB0byBoYW5kbGUgbG9hZGluZyBpbWFnZXNcbiAqL1xuZnVuY3Rpb24gTGF6eUxvYWRlciggaW1nLCBmbGlja2l0eSApIHtcbiAgdGhpcy5pbWcgPSBpbWc7XG4gIHRoaXMuZmxpY2tpdHkgPSBmbGlja2l0eTtcbiAgdGhpcy5sb2FkKCk7XG59XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgLy8gZ2V0IHNyYyAmIHNyY3NldFxuICB2YXIgc3JjID0gdGhpcy5pbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkJykgfHxcbiAgICB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3JjJyk7XG4gIHZhciBzcmNzZXQgPSB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG4gIC8vIHNldCBzcmMgJiBzZXJzZXRcbiAgdGhpcy5pbWcuc3JjID0gc3JjO1xuICBpZiAoIHNyY3NldCApIHtcbiAgICB0aGlzLmltZy5zZXRBdHRyaWJ1dGUoICdzcmNzZXQnLCBzcmNzZXQgKTtcbiAgfVxuICAvLyByZW1vdmUgYXR0clxuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgdGhpcy5pbWcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyYycpO1xuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG59O1xuXG5MYXp5TG9hZGVyLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWxvYWRlZCcgKTtcbn07XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWVycm9yJyApO1xufTtcblxuTGF6eUxvYWRlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiggZXZlbnQsIGNsYXNzTmFtZSApIHtcbiAgLy8gdW5iaW5kIGV2ZW50c1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuXG4gIHZhciBjZWxsID0gdGhpcy5mbGlja2l0eS5nZXRQYXJlbnRDZWxsKCB0aGlzLmltZyApO1xuICB2YXIgY2VsbEVsZW0gPSBjZWxsICYmIGNlbGwuZWxlbWVudDtcbiAgdGhpcy5mbGlja2l0eS5jZWxsU2l6ZUNoYW5nZSggY2VsbEVsZW0gKTtcblxuICB0aGlzLmltZy5jbGFzc0xpc3QuYWRkKCBjbGFzc05hbWUgKTtcbiAgdGhpcy5mbGlja2l0eS5kaXNwYXRjaEV2ZW50KCAnbGF6eUxvYWQnLCBldmVudCwgY2VsbEVsZW0gKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5MYXp5TG9hZGVyID0gTGF6eUxvYWRlcjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/lazyload.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/page-dots.js":
+/*!***********************************************!*\
+ !*** ./node_modules/flickity/js/page-dots.js ***!
+ \***********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// page dots\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n __webpack_require__(/*! unipointer/unipointer */ \"./node_modules/unipointer/unipointer.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n\n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n\n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcGFnZS1kb3RzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9wYWdlLWRvdHMuanM/MDYyOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwYWdlIGRvdHNcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAndW5pcG9pbnRlci91bmlwb2ludGVyJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscydcbiAgICBdLCBmdW5jdGlvbiggRmxpY2tpdHksIFVuaXBvaW50ZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaXBvaW50ZXIsIHV0aWxzICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCcuL2ZsaWNraXR5JyksXG4gICAgICByZXF1aXJlKCd1bmlwb2ludGVyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVW5pcG9pbnRlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pcG9pbnRlciwgdXRpbHMgKSB7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhZ2VEb3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gUGFnZURvdHMoIHBhcmVudCApIHtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG5QYWdlRG90cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBVbmlwb2ludGVyLnByb3RvdHlwZSApO1xuXG5QYWdlRG90cy5wcm90b3R5cGUuX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjcmVhdGUgaG9sZGVyIGVsZW1lbnRcbiAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICB0aGlzLmhvbGRlci5jbGFzc05hbWUgPSAnZmxpY2tpdHktcGFnZS1kb3RzJztcbiAgLy8gY3JlYXRlIGRvdHMsIGFycmF5IG9mIGVsZW1lbnRzXG4gIHRoaXMuZG90cyA9IFtdO1xuICAvLyBldmVudHNcbiAgdGhpcy5oYW5kbGVDbGljayA9IHRoaXMub25DbGljay5iaW5kKCB0aGlzICk7XG4gIHRoaXMub24oICdwb2ludGVyRG93bicsIHRoaXMucGFyZW50LmNoaWxkVUlQb2ludGVyRG93bi5iaW5kKCB0aGlzLnBhcmVudCApICk7XG59O1xuXG5QYWdlRG90cy5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zZXREb3RzKCk7XG4gIHRoaXMuaG9sZGVyLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2sgKTtcbiAgdGhpcy5iaW5kU3RhcnRFdmVudCggdGhpcy5ob2xkZXIgKTtcbiAgLy8gYWRkIHRvIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmhvbGRlciApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmRlYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5ob2xkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayApO1xuICB0aGlzLnVuYmluZFN0YXJ0RXZlbnQoIHRoaXMuaG9sZGVyICk7XG4gIC8vIHJlbW92ZSBmcm9tIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LnJlbW92ZUNoaWxkKCB0aGlzLmhvbGRlciApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnNldERvdHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGRpZmZlcmVuY2UgYmV0d2VlbiBudW1iZXIgb2Ygc2xpZGVzIGFuZCBudW1iZXIgb2YgZG90c1xuICB2YXIgZGVsdGEgPSB0aGlzLnBhcmVudC5zbGlkZXMubGVuZ3RoIC0gdGhpcy5kb3RzLmxlbmd0aDtcbiAgaWYgKCBkZWx0YSA+IDAgKSB7XG4gICAgdGhpcy5hZGREb3RzKCBkZWx0YSApO1xuICB9IGVsc2UgaWYgKCBkZWx0YSA8IDAgKSB7XG4gICAgdGhpcy5yZW1vdmVEb3RzKCAtZGVsdGEgKTtcbiAgfVxufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmFkZERvdHMgPSBmdW5jdGlvbiggY291bnQgKSB7XG4gIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgdmFyIG5ld0RvdHMgPSBbXTtcbiAgdmFyIGxlbmd0aCA9IHRoaXMuZG90cy5sZW5ndGg7XG4gIHZhciBtYXggPSBsZW5ndGggKyBjb3VudDtcblxuICBmb3IgKCB2YXIgaSA9IGxlbmd0aDsgaSA8IG1heDsgaSsrICkge1xuICAgIHZhciBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGRvdC5jbGFzc05hbWUgPSAnZG90JztcbiAgICBkb3Quc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsICdQYWdlIGRvdCAnICsgKCBpICsgMSApICk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvdCApO1xuICAgIG5ld0RvdHMucHVzaCggZG90ICk7XG4gIH1cblxuICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZCggZnJhZ21lbnQgKTtcbiAgdGhpcy5kb3RzID0gdGhpcy5kb3RzLmNvbmNhdCggbmV3RG90cyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnJlbW92ZURvdHMgPSBmdW5jdGlvbiggY291bnQgKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoaXMuZG90cyBjb2xsZWN0aW9uXG4gIHZhciByZW1vdmVEb3RzID0gdGhpcy5kb3RzLnNwbGljZSggdGhpcy5kb3RzLmxlbmd0aCAtIGNvdW50LCBjb3VudCApO1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgcmVtb3ZlRG90cy5mb3JFYWNoKCBmdW5jdGlvbiggZG90ICkge1xuICAgIHRoaXMuaG9sZGVyLnJlbW92ZUNoaWxkKCBkb3QgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSBzZWxlY3RlZCBjbGFzcyBvbiBwcmV2aW91c1xuICBpZiAoIHRoaXMuc2VsZWN0ZWREb3QgKSB7XG4gICAgdGhpcy5zZWxlY3RlZERvdC5jbGFzc05hbWUgPSAnZG90JztcbiAgICB0aGlzLnNlbGVjdGVkRG90LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50Jyk7XG4gIH1cbiAgLy8gZG9uJ3QgcHJvY2VlZCBpZiBubyBkb3RzXG4gIGlmICggIXRoaXMuZG90cy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc2VsZWN0ZWREb3QgPSB0aGlzLmRvdHNbIHRoaXMucGFyZW50LnNlbGVjdGVkSW5kZXggXTtcbiAgdGhpcy5zZWxlY3RlZERvdC5jbGFzc05hbWUgPSAnZG90IGlzLXNlbGVjdGVkJztcbiAgdGhpcy5zZWxlY3RlZERvdC5zZXRBdHRyaWJ1dGUoICdhcmlhLWN1cnJlbnQnLCAnc3RlcCcgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5vblRhcCA9IC8vIG9sZCBtZXRob2QgbmFtZSwgYmFja3dhcmRzLWNvbXBhdGlibGVcblBhZ2VEb3RzLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAvLyBvbmx5IGNhcmUgYWJvdXQgZG90IGNsaWNrc1xuICBpZiAoIHRhcmdldC5ub2RlTmFtZSAhPSAnTEknICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMucGFyZW50LnVpQ2hhbmdlKCk7XG4gIHZhciBpbmRleCA9IHRoaXMuZG90cy5pbmRleE9mKCB0YXJnZXQgKTtcbiAgdGhpcy5wYXJlbnQuc2VsZWN0KCBpbmRleCApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gIHRoaXMuYWxsT2ZmKCk7XG59O1xuXG5GbGlja2l0eS5QYWdlRG90cyA9IFBhZ2VEb3RzO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGbGlja2l0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIEZsaWNraXR5LmRlZmF1bHRzLCB7XG4gIHBhZ2VEb3RzOiB0cnVlXG59KTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUGFnZURvdHMnKTtcblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUGFnZURvdHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnBhZ2VEb3RzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBhZ2VEb3RzID0gbmV3IFBhZ2VEb3RzKCB0aGlzICk7XG4gIC8vIGV2ZW50c1xuICB0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3NlbGVjdCcsIHRoaXMudXBkYXRlU2VsZWN0ZWRQYWdlRG90cyApO1xuICB0aGlzLm9uKCAnY2VsbENoYW5nZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3Jlc2l6ZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQYWdlRG90cyApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLmFjdGl2YXRlKCk7XG59O1xuXG5wcm90by51cGRhdGVTZWxlY3RlZFBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMudXBkYXRlU2VsZWN0ZWQoKTtcbn07XG5cbnByb3RvLnVwZGF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuc2V0RG90cygpO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuZGVhY3RpdmF0ZSgpO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbkZsaWNraXR5LlBhZ2VEb3RzID0gUGFnZURvdHM7XG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/page-dots.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/player.js":
+/*!********************************************!*\
+ !*** ./node_modules/flickity/js/player.js ***!
+ \********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\"),\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, utils, Flickity ) {\n return factory( EvEmitter, utils, Flickity );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n\n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n this.player = new Player( this );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcGxheWVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9wbGF5ZXIuanM/YjE4YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwbGF5ZXIgJiBhdXRvUGxheVxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJyxcbiAgICAgICcuL2ZsaWNraXR5J1xuICAgIF0sIGZ1bmN0aW9uKCBFdkVtaXR0ZXIsIHV0aWxzLCBGbGlja2l0eSApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCBFdkVtaXR0ZXIsIHV0aWxzLCBGbGlja2l0eSApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKSxcbiAgICAgIHJlcXVpcmUoJy4vZmxpY2tpdHknKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICB3aW5kb3cuRmxpY2tpdHlcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRXZFbWl0dGVyLCB1dGlscywgRmxpY2tpdHkgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIFBsYXllciggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5zdGF0ZSA9ICdzdG9wcGVkJztcbiAgLy8gdmlzaWJpbGl0eSBjaGFuZ2UgZXZlbnQgaGFuZGxlclxuICB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSA9IHRoaXMudmlzaWJpbGl0eUNoYW5nZS5iaW5kKCB0aGlzICk7XG4gIHRoaXMub25WaXNpYmlsaXR5UGxheSA9IHRoaXMudmlzaWJpbGl0eVBsYXkuYmluZCggdGhpcyApO1xufVxuXG5QbGF5ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG4vLyBzdGFydCBwbGF5XG5QbGF5ZXIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLnN0YXRlID09ICdwbGF5aW5nJyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZG8gbm90IHBsYXkgaWYgcGFnZSBpcyBoaWRkZW4sIHN0YXJ0IHBsYXlpbmcgd2hlbiBwYWdlIGlzIHZpc2libGVcbiAgdmFyIGlzUGFnZUhpZGRlbiA9IGRvY3VtZW50LmhpZGRlbjtcbiAgaWYgKCBpc1BhZ2VIaWRkZW4gKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eVBsYXkgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YXRlID0gJ3BsYXlpbmcnO1xuICAvLyBsaXN0ZW4gdG8gdmlzaWJpbGl0eSBjaGFuZ2VcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSApO1xuICAvLyBzdGFydCB0aWNraW5nXG4gIHRoaXMudGljaygpO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRvIG5vdCB0aWNrIGlmIG5vdCBwbGF5aW5nXG4gIGlmICggdGhpcy5zdGF0ZSAhPSAncGxheWluZycgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRpbWUgPSB0aGlzLnBhcmVudC5vcHRpb25zLmF1dG9QbGF5O1xuICAvLyBkZWZhdWx0IHRvIDMgc2Vjb25kc1xuICB0aW1lID0gdHlwZW9mIHRpbWUgPT0gJ251bWJlcicgPyB0aW1lIDogMzAwMDtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgLy8gSEFDSzogcmVzZXQgdGlja3MgaWYgc3RvcHBlZCBhbmQgc3RhcnRlZCB3aXRoaW4gaW50ZXJ2YWxcbiAgdGhpcy5jbGVhcigpO1xuICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICBfdGhpcy5wYXJlbnQubmV4dCggdHJ1ZSApO1xuICAgIF90aGlzLnRpY2soKTtcbiAgfSwgdGltZSApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc3RhdGUgPSAnc3RvcHBlZCc7XG4gIHRoaXMuY2xlYXIoKTtcbiAgLy8gcmVtb3ZlIHZpc2liaWxpdHkgY2hhbmdlIGV2ZW50XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2UgKTtcbn07XG5cblBsYXllci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVvdXQgKTtcbn07XG5cblBsYXllci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLnN0YXRlID09ICdwbGF5aW5nJyApIHtcbiAgICB0aGlzLnN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnVucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmUtc3RhcnQgcGxheSBpZiBwYXVzZWRcbiAgaWYgKCB0aGlzLnN0YXRlID09ICdwYXVzZWQnICkge1xuICAgIHRoaXMucGxheSgpO1xuICB9XG59O1xuXG4vLyBwYXVzZSBpZiBwYWdlIHZpc2liaWxpdHkgaXMgaGlkZGVuLCB1bnBhdXNlIGlmIHZpc2libGVcblBsYXllci5wcm90b3R5cGUudmlzaWJpbGl0eUNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXNQYWdlSGlkZGVuID0gZG9jdW1lbnQuaGlkZGVuO1xuICB0aGlzWyBpc1BhZ2VIaWRkZW4gPyAncGF1c2UnIDogJ3VucGF1c2UnIF0oKTtcbn07XG5cblBsYXllci5wcm90b3R5cGUudmlzaWJpbGl0eVBsYXkgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5KCk7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5vblZpc2liaWxpdHlQbGF5ICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGbGlja2l0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIEZsaWNraXR5LmRlZmF1bHRzLCB7XG4gIHBhdXNlQXV0b1BsYXlPbkhvdmVyOiB0cnVlXG59KTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUGxheWVyJyk7XG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbnByb3RvLl9jcmVhdGVQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIgPSBuZXcgUGxheWVyKCB0aGlzICk7XG5cbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZVBsYXllciApO1xuICB0aGlzLm9uKCAndWlDaGFuZ2UnLCB0aGlzLnN0b3BQbGF5ZXIgKTtcbiAgdGhpcy5vbiggJ3BvaW50ZXJEb3duJywgdGhpcy5zdG9wUGxheWVyICk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlUGxheWVyICk7XG59O1xuXG5wcm90by5hY3RpdmF0ZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMuYXV0b1BsYXkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgdGhpcyApO1xufTtcblxuLy8gUGxheWVyIEFQSSwgZG9uJ3QgaGF0ZSB0aGUgLi4uIHRoYW5rcyBJIGtub3cgd2hlcmUgdGhlIGRvb3IgaXNcblxucHJvdG8ucGxheVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5wbGF5KCk7XG59O1xuXG5wcm90by5zdG9wUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnN0b3AoKTtcbn07XG5cbnByb3RvLnBhdXNlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnBhdXNlKCk7XG59O1xuXG5wcm90by51bnBhdXNlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnVucGF1c2UoKTtcbn07XG5cbnByb3RvLmRlYWN0aXZhdGVQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIuc3RvcCgpO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlZW50ZXInLCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSBtb3VzZWVudGVyL2xlYXZlIC0tLS0tIC8vXG5cbi8vIHBhdXNlIGF1dG8tcGxheSBvbiBob3ZlclxucHJvdG8ub25tb3VzZWVudGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5wYXVzZUF1dG9QbGF5T25Ib3ZlciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWxlYXZlJywgdGhpcyApO1xufTtcblxuLy8gcmVzdW1lIGF1dG8tcGxheSBvbiBob3ZlciBvZmZcbnByb3RvLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci51bnBhdXNlKCk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2VsZWF2ZScsIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5QbGF5ZXIgPSBQbGF5ZXI7XG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/player.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/prev-next-button.js":
+/*!******************************************************!*\
+ !*** ./node_modules/flickity/js/prev-next-button.js ***!
+ \******************************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n __webpack_require__(/*! unipointer/unipointer */ \"./node_modules/unipointer/unipointer.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n\n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n\n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg');\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path');\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n};\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30\n }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n\n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n\n this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcHJldi1uZXh0LWJ1dHRvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcHJldi1uZXh0LWJ1dHRvbi5qcz9jZmI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIHByZXYvbmV4dCBidXR0b25zXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ3VuaXBvaW50ZXIvdW5pcG9pbnRlcicsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIEZsaWNraXR5LCBVbmlwb2ludGVyLCB1dGlscyApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCBVbmlwb2ludGVyLCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgndW5pcG9pbnRlcicpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgd2luZG93LlVuaXBvaW50ZXIsXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaXBvaW50ZXIsIHV0aWxzICkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3ZnVVJJID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJldk5leHRCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gUHJldk5leHRCdXR0b24oIGRpcmVjdGlvbiwgcGFyZW50ICkge1xuICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBVbmlwb2ludGVyLnByb3RvdHlwZSApO1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBwcm9wZXJ0aWVzXG4gIHRoaXMuaXNFbmFibGVkID0gdHJ1ZTtcbiAgdGhpcy5pc1ByZXZpb3VzID0gdGhpcy5kaXJlY3Rpb24gPT0gLTE7XG4gIHZhciBsZWZ0RGlyZWN0aW9uID0gdGhpcy5wYXJlbnQub3B0aW9ucy5yaWdodFRvTGVmdCA/IDEgOiAtMTtcbiAgdGhpcy5pc0xlZnQgPSB0aGlzLmRpcmVjdGlvbiA9PSBsZWZ0RGlyZWN0aW9uO1xuXG4gIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIGVsZW1lbnQuY2xhc3NOYW1lID0gJ2ZsaWNraXR5LWJ1dHRvbiBmbGlja2l0eS1wcmV2LW5leHQtYnV0dG9uJztcbiAgZWxlbWVudC5jbGFzc05hbWUgKz0gdGhpcy5pc1ByZXZpb3VzID8gJyBwcmV2aW91cycgOiAnIG5leHQnO1xuICAvLyBwcmV2ZW50IGJ1dHRvbiBmcm9tIHN1Ym1pdHRpbmcgZm9ybSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMDgzNjA3Ni8xODIxODNcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoICd0eXBlJywgJ2J1dHRvbicgKTtcbiAgLy8gaW5pdCBhcyBkaXNhYmxlZFxuICB0aGlzLmRpc2FibGUoKTtcblxuICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnLCB0aGlzLmlzUHJldmlvdXMgPyAnUHJldmlvdXMnIDogJ05leHQnICk7XG5cbiAgLy8gY3JlYXRlIGFycm93XG4gIHZhciBzdmcgPSB0aGlzLmNyZWF0ZVNWRygpO1xuICBlbGVtZW50LmFwcGVuZENoaWxkKCBzdmcgKTtcbiAgLy8gZXZlbnRzXG4gIHRoaXMucGFyZW50Lm9uKCAnc2VsZWN0JywgdGhpcy51cGRhdGUuYmluZCggdGhpcyApICk7XG4gIHRoaXMub24oICdwb2ludGVyRG93bicsIHRoaXMucGFyZW50LmNoaWxkVUlQb2ludGVyRG93bi5iaW5kKCB0aGlzLnBhcmVudCApICk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5iaW5kU3RhcnRFdmVudCggdGhpcy5lbGVtZW50ICk7XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzICk7XG4gIC8vIGFkZCB0byBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5lbGVtZW50ICk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG4gIC8vIGNsaWNrIGV2ZW50c1xuICB0aGlzLnVuYmluZFN0YXJ0RXZlbnQoIHRoaXMuZWxlbWVudCApO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcyApO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmNyZWF0ZVNWRyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCBzdmdVUkksICdzdmcnKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ2ZsaWNraXR5LWJ1dHRvbi1pY29uJyApO1xuICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsICcwIDAgMTAwIDEwMCcgKTtcbiAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3BhdGgnKTtcbiAgdmFyIHBhdGhNb3ZlbWVudHMgPSBnZXRBcnJvd01vdmVtZW50cyggdGhpcy5wYXJlbnQub3B0aW9ucy5hcnJvd1NoYXBlICk7XG4gIHBhdGguc2V0QXR0cmlidXRlKCAnZCcsIHBhdGhNb3ZlbWVudHMgKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoICdjbGFzcycsICdhcnJvdycgKTtcbiAgLy8gcm90YXRlIGFycm93XG4gIGlmICggIXRoaXMuaXNMZWZ0ICkge1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgxMDAsIDEwMCkgcm90YXRlKDE4MCkgJyApO1xuICB9XG4gIHN2Zy5hcHBlbmRDaGlsZCggcGF0aCApO1xuICByZXR1cm4gc3ZnO1xufTtcblxuLy8gZ2V0IFNWRyBwYXRoIG1vdm1lbWVudFxuZnVuY3Rpb24gZ2V0QXJyb3dNb3ZlbWVudHMoIHNoYXBlICkge1xuICAvLyB1c2Ugc2hhcGUgYXMgbW92ZW1lbnQgaWYgc3RyaW5nXG4gIGlmICggdHlwZW9mIHNoYXBlID09ICdzdHJpbmcnICkge1xuICAgIHJldHVybiBzaGFwZTtcbiAgfVxuICAvLyBjcmVhdGUgbW92ZW1lbnQgc3RyaW5nXG4gIHJldHVybiAnTSAnICsgc2hhcGUueDAgKyAnLDUwJyArXG4gICAgJyBMICcgKyBzaGFwZS54MSArICcsJyArICggc2hhcGUueTEgKyA1MCApICtcbiAgICAnIEwgJyArIHNoYXBlLngyICsgJywnICsgKCBzaGFwZS55MiArIDUwICkgK1xuICAgICcgTCAnICsgc2hhcGUueDMgKyAnLDUwICcgK1xuICAgICcgTCAnICsgc2hhcGUueDIgKyAnLCcgKyAoIDUwIC0gc2hhcGUueTIgKSArXG4gICAgJyBMICcgKyBzaGFwZS54MSArICcsJyArICggNTAgLSBzaGFwZS55MSApICtcbiAgICAnIFonO1xufVxuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSB1dGlscy5oYW5kbGVFdmVudDtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLm9uY2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGFyZW50LnVpQ2hhbmdlKCk7XG4gIHZhciBtZXRob2QgPSB0aGlzLmlzUHJldmlvdXMgPyAncHJldmlvdXMnIDogJ25leHQnO1xuICB0aGlzLnBhcmVudFsgbWV0aG9kIF0oKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlO1xuICB0aGlzLmlzRW5hYmxlZCA9IHRydWU7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRW5hYmxlZCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50LmRpc2FibGVkID0gdHJ1ZTtcbiAgdGhpcy5pc0VuYWJsZWQgPSBmYWxzZTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gaW5kZXggb2YgZmlyc3Qgb3IgbGFzdCBzbGlkZSwgaWYgcHJldmlvdXMgb3IgbmV4dFxuICB2YXIgc2xpZGVzID0gdGhpcy5wYXJlbnQuc2xpZGVzO1xuICAvLyBlbmFibGUgaXMgd3JhcEFyb3VuZCBhbmQgYXQgbGVhc3QgMiBzbGlkZXNcbiAgaWYgKCB0aGlzLnBhcmVudC5vcHRpb25zLndyYXBBcm91bmQgJiYgc2xpZGVzLmxlbmd0aCA+IDEgKSB7XG4gICAgdGhpcy5lbmFibGUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IHNsaWRlcy5sZW5ndGggPyBzbGlkZXMubGVuZ3RoIC0gMSA6IDA7XG4gIHZhciBib3VuZEluZGV4ID0gdGhpcy5pc1ByZXZpb3VzID8gMCA6IGxhc3RJbmRleDtcbiAgdmFyIG1ldGhvZCA9IHRoaXMucGFyZW50LnNlbGVjdGVkSW5kZXggPT0gYm91bmRJbmRleCA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xuICB0aGlzWyBtZXRob2QgXSgpO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gIHRoaXMuYWxsT2ZmKCk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGbGlja2l0eSBwcm90b3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBwcmV2TmV4dEJ1dHRvbnM6IHRydWUsXG4gIGFycm93U2hhcGU6IHtcbiAgICB4MDogMTAsXG4gICAgeDE6IDYwLCB5MTogNTAsXG4gICAgeDI6IDcwLCB5MjogNDAsXG4gICAgeDM6IDMwXG4gIH1cbn0pO1xuXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzLnB1c2goJ19jcmVhdGVQcmV2TmV4dEJ1dHRvbnMnKTtcbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZVByZXZOZXh0QnV0dG9ucyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMucHJldk5leHRCdXR0b25zICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMucHJldkJ1dHRvbiA9IG5ldyBQcmV2TmV4dEJ1dHRvbiggLTEsIHRoaXMgKTtcbiAgdGhpcy5uZXh0QnV0dG9uID0gbmV3IFByZXZOZXh0QnV0dG9uKCAxLCB0aGlzICk7XG5cbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wcmV2QnV0dG9uLmFjdGl2YXRlKCk7XG4gIHRoaXMubmV4dEJ1dHRvbi5hY3RpdmF0ZSgpO1xuICB0aGlzLm9uKCAnZGVhY3RpdmF0ZScsIHRoaXMuZGVhY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyApO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnByZXZCdXR0b24uZGVhY3RpdmF0ZSgpO1xuICB0aGlzLm5leHRCdXR0b24uZGVhY3RpdmF0ZSgpO1xuICB0aGlzLm9mZiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5GbGlja2l0eS5QcmV2TmV4dEJ1dHRvbiA9IFByZXZOZXh0QnV0dG9uO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFdBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/prev-next-button.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/flickity/js/slide.js":
+/*!*******************************************!*\
+ !*** ./node_modules/flickity/js/slide.js ***!
+ \*******************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// slide\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n });\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n });\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\nreturn Slide;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvc2xpZGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL3NsaWRlLmpzPzc2NTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2xpZGVcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuU2xpZGUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBTbGlkZSggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5pc09yaWdpbkxlZnQgPSBwYXJlbnQub3JpZ2luU2lkZSA9PSAnbGVmdCc7XG4gIHRoaXMuY2VsbHMgPSBbXTtcbiAgdGhpcy5vdXRlcldpZHRoID0gMDtcbiAgdGhpcy5oZWlnaHQgPSAwO1xufVxuXG52YXIgcHJvdG8gPSBTbGlkZS5wcm90b3R5cGU7XG5cbnByb3RvLmFkZENlbGwgPSBmdW5jdGlvbiggY2VsbCApIHtcbiAgdGhpcy5jZWxscy5wdXNoKCBjZWxsICk7XG4gIHRoaXMub3V0ZXJXaWR0aCArPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heCggY2VsbC5zaXplLm91dGVySGVpZ2h0LCB0aGlzLmhlaWdodCApO1xuICAvLyBmaXJzdCBjZWxsIHN0dWZmXG4gIGlmICggdGhpcy5jZWxscy5sZW5ndGggPT0gMSApIHtcbiAgICB0aGlzLnggPSBjZWxsLng7IC8vIHggY29tZXMgZnJvbSBmaXJzdCBjZWxsXG4gICAgdmFyIGJlZ2luTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHRoaXMuZmlyc3RNYXJnaW4gPSBjZWxsLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIH1cbn07XG5cbnByb3RvLnVwZGF0ZVRhcmdldCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZW5kTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnO1xuICB2YXIgbGFzdENlbGwgPSB0aGlzLmdldExhc3RDZWxsKCk7XG4gIHZhciBsYXN0TWFyZ2luID0gbGFzdENlbGwgPyBsYXN0Q2VsbC5zaXplWyBlbmRNYXJnaW4gXSA6IDA7XG4gIHZhciBzbGlkZVdpZHRoID0gdGhpcy5vdXRlcldpZHRoIC0gKCB0aGlzLmZpcnN0TWFyZ2luICsgbGFzdE1hcmdpbiApO1xuICB0aGlzLnRhcmdldCA9IHRoaXMueCArIHRoaXMuZmlyc3RNYXJnaW4gKyBzbGlkZVdpZHRoICogdGhpcy5wYXJlbnQuY2VsbEFsaWduO1xufTtcblxucHJvdG8uZ2V0TGFzdENlbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHNbIHRoaXMuY2VsbHMubGVuZ3RoIC0gMSBdO1xufTtcblxucHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5zZWxlY3QoKTtcbiAgfSk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGNlbGwudW5zZWxlY3QoKTtcbiAgfSk7XG59O1xuXG5wcm90by5nZXRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHMubWFwKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICByZXR1cm4gY2VsbC5lbGVtZW50O1xuICB9KTtcbn07XG5cbnJldHVybiBTbGlkZTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/slide.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/get-size/get-size.js":
+/*!*******************************************!*\
+ !*** ./node_modules/get-size/get-size.js ***!
+ \*******************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZ2V0LXNpemUvZ2V0LXNpemUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2dldC1zaXplL2dldC1zaXplLmpzPzQwYWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBnZXRTaXplIHYyLjAuM1xuICogbWVhc3VyZSBzaXplIG9mIGVsZW1lbnRzXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qIGpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUgKi9cbi8qIGdsb2JhbHMgY29uc29sZTogZmFsc2UgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5nZXRTaXplID0gZmFjdG9yeSgpO1xuICB9XG5cbn0pKCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2V0IGEgbnVtYmVyIGZyb20gYSBzdHJpbmcsIG5vdCBhIHBlcmNlbnRhZ2VcbmZ1bmN0aW9uIGdldFN0eWxlU2l6ZSggdmFsdWUgKSB7XG4gIHZhciBudW0gPSBwYXJzZUZsb2F0KCB2YWx1ZSApO1xuICAvLyBub3QgYSBwZXJjZW50IGxpa2UgJzEwMCUnLCBhbmQgYSBudW1iZXJcbiAgdmFyIGlzVmFsaWQgPSB2YWx1ZS5pbmRleE9mKCclJykgPT0gLTEgJiYgIWlzTmFOKCBudW0gKTtcbiAgcmV0dXJuIGlzVmFsaWQgJiYgbnVtO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIGxvZ0Vycm9yID0gdHlwZW9mIGNvbnNvbGUgPT0gJ3VuZGVmaW5lZCcgPyBub29wIDpcbiAgZnVuY3Rpb24oIG1lc3NhZ2UgKSB7XG4gICAgY29uc29sZS5lcnJvciggbWVzc2FnZSApO1xuICB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZWFzdXJlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIG1lYXN1cmVtZW50cyA9IFtcbiAgJ3BhZGRpbmdMZWZ0JyxcbiAgJ3BhZGRpbmdSaWdodCcsXG4gICdwYWRkaW5nVG9wJyxcbiAgJ3BhZGRpbmdCb3R0b20nLFxuICAnbWFyZ2luTGVmdCcsXG4gICdtYXJnaW5SaWdodCcsXG4gICdtYXJnaW5Ub3AnLFxuICAnbWFyZ2luQm90dG9tJyxcbiAgJ2JvcmRlckxlZnRXaWR0aCcsXG4gICdib3JkZXJSaWdodFdpZHRoJyxcbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlckJvdHRvbVdpZHRoJ1xuXTtcblxudmFyIG1lYXN1cmVtZW50c0xlbmd0aCA9IG1lYXN1cmVtZW50cy5sZW5ndGg7XG5cbmZ1bmN0aW9uIGdldFplcm9TaXplKCkge1xuICB2YXIgc2l6ZSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgaW5uZXJXaWR0aDogMCxcbiAgICBpbm5lckhlaWdodDogMCxcbiAgICBvdXRlcldpZHRoOiAwLFxuICAgIG91dGVySGVpZ2h0OiAwXG4gIH07XG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0U3R5bGUsIGdldCBzdHlsZSBvZiBlbGVtZW50LCBjaGVjayBmb3IgRmlyZWZveCBidWdcbiAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuICovXG5mdW5jdGlvbiBnZXRTdHlsZSggZWxlbSApIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuICBpZiAoICFzdHlsZSApIHtcbiAgICBsb2dFcnJvciggJ1N0eWxlIHJldHVybmVkICcgKyBzdHlsZSArXG4gICAgICAnLiBBcmUgeW91IHJ1bm5pbmcgdGhpcyBjb2RlIGluIGEgaGlkZGVuIGlmcmFtZSBvbiBGaXJlZm94PyAnICtcbiAgICAgICdTZWUgaHR0cHM6Ly9iaXQubHkvZ2V0c2l6ZWJ1ZzEnICk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgaXNTZXR1cCA9IGZhbHNlO1xuXG52YXIgaXNCb3hTaXplT3V0ZXI7XG5cbi8qKlxuICogc2V0dXBcbiAqIGNoZWNrIGlzQm94U2l6ZXJPdXRlclxuICogZG8gb24gZmlyc3QgZ2V0U2l6ZSgpIHJhdGhlciB0aGFuIG9uIHBhZ2UgbG9hZCBmb3IgRmlyZWZveCBidWdcbiAqL1xuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIC8vIHNldHVwIG9uY2VcbiAgaWYgKCBpc1NldHVwICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc1NldHVwID0gdHJ1ZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBib3ggc2l6aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLyoqXG4gICAqIENocm9tZSAmIFNhZmFyaSBtZWFzdXJlIHRoZSBvdXRlci13aWR0aCBvbiBzdHlsZS53aWR0aCBvbiBib3JkZXItYm94IGVsZW1zXG4gICAqIElFMTEgJiBGaXJlZm94PDI5IG1lYXN1cmVzIHRoZSBpbm5lci13aWR0aFxuICAgKi9cbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuICBkaXYuc3R5bGUucGFkZGluZyA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4IDJweCAzcHggNHB4JztcbiAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICBib2R5LmFwcGVuZENoaWxkKCBkaXYgKTtcbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGRpdiApO1xuICAvLyByb3VuZCB2YWx1ZSBmb3IgYnJvd3NlciB6b29tLiBkZXNhbmRyby9tYXNvbnJ5IzkyOFxuICBpc0JveFNpemVPdXRlciA9IE1hdGgucm91bmQoIGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKSApID09IDIwMDtcbiAgZ2V0U2l6ZS5pc0JveFNpemVPdXRlciA9IGlzQm94U2l6ZU91dGVyO1xuXG4gIGJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXRTaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIGdldFNpemUoIGVsZW0gKSB7XG4gIHNldHVwKCk7XG5cbiAgLy8gdXNlIHF1ZXJ5U2VsZXRvciBpZiBlbGVtIGlzIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtID09ICdzdHJpbmcnICkge1xuICAgIGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbGVtICk7XG4gIH1cblxuICAvLyBkbyBub3QgcHJvY2VlZCBvbiBub24tb2JqZWN0c1xuICBpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtICE9ICdvYmplY3QnIHx8ICFlbGVtLm5vZGVUeXBlICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGdldFN0eWxlKCBlbGVtICk7XG5cbiAgLy8gaWYgaGlkZGVuLCBldmVyeXRoaW5nIGlzIDBcbiAgaWYgKCBzdHlsZS5kaXNwbGF5ID09ICdub25lJyApIHtcbiAgICByZXR1cm4gZ2V0WmVyb1NpemUoKTtcbiAgfVxuXG4gIHZhciBzaXplID0ge307XG4gIHNpemUud2lkdGggPSBlbGVtLm9mZnNldFdpZHRoO1xuICBzaXplLmhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0O1xuXG4gIHZhciBpc0JvcmRlckJveCA9IHNpemUuaXNCb3JkZXJCb3ggPSBzdHlsZS5ib3hTaXppbmcgPT0gJ2JvcmRlci1ib3gnO1xuXG4gIC8vIGdldCBhbGwgbWVhc3VyZW1lbnRzXG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgdmFyIHZhbHVlID0gc3R5bGVbIG1lYXN1cmVtZW50IF07XG4gICAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gICAgLy8gYW55ICdhdXRvJywgJ21lZGl1bScgdmFsdWUgd2lsbCBiZSAwXG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9ICFpc05hTiggbnVtICkgPyBudW0gOiAwO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdXaWR0aCA9IHNpemUucGFkZGluZ0xlZnQgKyBzaXplLnBhZGRpbmdSaWdodDtcbiAgdmFyIHBhZGRpbmdIZWlnaHQgPSBzaXplLnBhZGRpbmdUb3AgKyBzaXplLnBhZGRpbmdCb3R0b207XG4gIHZhciBtYXJnaW5XaWR0aCA9IHNpemUubWFyZ2luTGVmdCArIHNpemUubWFyZ2luUmlnaHQ7XG4gIHZhciBtYXJnaW5IZWlnaHQgPSBzaXplLm1hcmdpblRvcCArIHNpemUubWFyZ2luQm90dG9tO1xuICB2YXIgYm9yZGVyV2lkdGggPSBzaXplLmJvcmRlckxlZnRXaWR0aCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aDtcbiAgdmFyIGJvcmRlckhlaWdodCA9IHNpemUuYm9yZGVyVG9wV2lkdGggKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuXG4gIHZhciBpc0JvcmRlckJveFNpemVPdXRlciA9IGlzQm9yZGVyQm94ICYmIGlzQm94U2l6ZU91dGVyO1xuXG4gIC8vIG92ZXJ3cml0ZSB3aWR0aCBhbmQgaGVpZ2h0IGlmIHdlIGNhbiBnZXQgaXQgZnJvbSBzdHlsZVxuICB2YXIgc3R5bGVXaWR0aCA9IGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKTtcbiAgaWYgKCBzdHlsZVdpZHRoICE9PSBmYWxzZSApIHtcbiAgICBzaXplLndpZHRoID0gc3R5bGVXaWR0aCArXG4gICAgICAvLyBhZGQgcGFkZGluZyBhbmQgYm9yZGVyIHVubGVzcyBpdCdzIGFscmVhZHkgaW5jbHVkaW5nIGl0XG4gICAgICAoIGlzQm9yZGVyQm94U2l6ZU91dGVyID8gMCA6IHBhZGRpbmdXaWR0aCArIGJvcmRlcldpZHRoICk7XG4gIH1cblxuICB2YXIgc3R5bGVIZWlnaHQgPSBnZXRTdHlsZVNpemUoIHN0eWxlLmhlaWdodCApO1xuICBpZiAoIHN0eWxlSGVpZ2h0ICE9PSBmYWxzZSApIHtcbiAgICBzaXplLmhlaWdodCA9IHN0eWxlSGVpZ2h0ICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ0hlaWdodCArIGJvcmRlckhlaWdodCApO1xuICB9XG5cbiAgc2l6ZS5pbm5lcldpZHRoID0gc2l6ZS53aWR0aCAtICggcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgc2l6ZS5pbm5lckhlaWdodCA9IHNpemUuaGVpZ2h0IC0gKCBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG5cbiAgc2l6ZS5vdXRlcldpZHRoID0gc2l6ZS53aWR0aCArIG1hcmdpbldpZHRoO1xuICBzaXplLm91dGVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyBtYXJnaW5IZWlnaHQ7XG5cbiAgcmV0dXJuIHNpemU7XG59XG5cbnJldHVybiBnZXRTaXplO1xuXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/get-size/get-size.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/intersection-observer/intersection-observer.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/intersection-observer/intersection-observer.js ***!
+ \*********************************************************************/
+/***/ (() => {
+
+eval("/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n\n(function(window, document) {\n'use strict';\n\n\n// Exits early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n // Minimal polyfill for Edge 15's lack of `isIntersecting`\n // See: https://github.com/w3c/IntersectionObserver/issues/211\n if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n Object.defineProperty(window.IntersectionObserverEntry.prototype,\n 'isIntersecting', {\n get: function () {\n return this.intersectionRatio > 0;\n }\n });\n }\n return;\n}\n\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n this.time = entry.time;\n this.target = entry.target;\n this.rootBounds = entry.rootBounds;\n this.boundingClientRect = entry.boundingClientRect;\n this.intersectionRect = entry.intersectionRect || getEmptyRect();\n this.isIntersecting = !!entry.intersectionRect;\n\n // Calculates the intersection ratio.\n var targetRect = this.boundingClientRect;\n var targetArea = targetRect.width * targetRect.height;\n var intersectionRect = this.intersectionRect;\n var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n // Sets intersection ratio.\n if (targetArea) {\n // Round the intersection ratio to avoid floating point math issues:\n // https://github.com/w3c/IntersectionObserver/issues/324\n this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n } else {\n // If area is zero and is intersecting, sets to 1, otherwise to 0\n this.intersectionRatio = this.isIntersecting ? 1 : 0;\n }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n * changes have queued. The function is not invoked if the queue has\n * been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n var options = opt_options || {};\n\n if (typeof callback != 'function') {\n throw new Error('callback must be a function');\n }\n\n if (options.root && options.root.nodeType != 1) {\n throw new Error('root must be an Element');\n }\n\n // Binds and throttles `this._checkForIntersections`.\n this._checkForIntersections = throttle(\n this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n // Private properties.\n this._callback = callback;\n this._observationTargets = [];\n this._queuedEntries = [];\n this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n // Public properties.\n this.thresholds = this._initThresholds(options.threshold);\n this.root = options.root || null;\n this.rootMargin = this._rootMarginValues.map(function(margin) {\n return margin.value + margin.unit;\n }).join(' ');\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n return item.element == target;\n });\n\n if (isTargetAlreadyObserved) {\n return;\n }\n\n if (!(target && target.nodeType == 1)) {\n throw new Error('target must be an Element');\n }\n\n this._registerInstance();\n this._observationTargets.push({element: target, entry: null});\n this._monitorIntersections();\n this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n this._observationTargets =\n this._observationTargets.filter(function(item) {\n\n return item.element != target;\n });\n if (!this._observationTargets.length) {\n this._unmonitorIntersections();\n this._unregisterInstance();\n }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n this._observationTargets = [];\n this._unmonitorIntersections();\n this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n var records = this._queuedEntries.slice();\n this._queuedEntries = [];\n return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n * a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n var threshold = opt_threshold || [0];\n if (!Array.isArray(threshold)) threshold = [threshold];\n\n return threshold.sort().filter(function(t, i, a) {\n if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n throw new Error('threshold must be a number between 0 and 1 inclusively');\n }\n return t !== a[i - 1];\n });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n * defaulting to '0px'.\n * @return {Array<Object>} An array of margin objects with the keys\n * value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n var marginString = opt_rootMargin || '0px';\n var margins = marginString.split(/\\s+/).map(function(margin) {\n var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n if (!parts) {\n throw new Error('rootMargin must be specified in pixels or percent');\n }\n return {value: parseFloat(parts[1]), unit: parts[2]};\n });\n\n // Handles shorthand.\n margins[1] = margins[1] || margins[0];\n margins[2] = margins[2] || margins[0];\n margins[3] = margins[3] || margins[1];\n\n return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function() {\n if (!this._monitoringIntersections) {\n this._monitoringIntersections = true;\n\n // If a poll interval is set, use polling instead of listening to\n // resize and scroll events or DOM mutations.\n if (this.POLL_INTERVAL) {\n this._monitoringInterval = setInterval(\n this._checkForIntersections, this.POLL_INTERVAL);\n }\n else {\n addEvent(window, 'resize', this._checkForIntersections, true);\n addEvent(document, 'scroll', this._checkForIntersections, true);\n\n if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {\n this._domObserver = new MutationObserver(this._checkForIntersections);\n this._domObserver.observe(document, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n }\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function() {\n if (this._monitoringIntersections) {\n this._monitoringIntersections = false;\n\n clearInterval(this._monitoringInterval);\n this._monitoringInterval = null;\n\n removeEvent(window, 'resize', this._checkForIntersections, true);\n removeEvent(document, 'scroll', this._checkForIntersections, true);\n\n if (this._domObserver) {\n this._domObserver.disconnect();\n this._domObserver = null;\n }\n }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n var rootIsInDom = this._rootIsInDom();\n var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n this._observationTargets.forEach(function(item) {\n var target = item.element;\n var targetRect = getBoundingClientRect(target);\n var rootContainsTarget = this._rootContainsTarget(target);\n var oldEntry = item.entry;\n var intersectionRect = rootIsInDom && rootContainsTarget &&\n this._computeTargetAndRootIntersection(target, rootRect);\n\n var newEntry = item.entry = new IntersectionObserverEntry({\n time: now(),\n target: target,\n boundingClientRect: targetRect,\n rootBounds: rootRect,\n intersectionRect: intersectionRect\n });\n\n if (!oldEntry) {\n this._queuedEntries.push(newEntry);\n } else if (rootIsInDom && rootContainsTarget) {\n // If the new entry intersection ratio has crossed any of the\n // thresholds, add a new entry.\n if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n this._queuedEntries.push(newEntry);\n }\n } else {\n // If the root is not in the DOM or target is not contained within\n // root but the previous entry for this target had an intersection,\n // add a new record indicating removal.\n if (oldEntry && oldEntry.isIntersecting) {\n this._queuedEntries.push(newEntry);\n }\n }\n }, this);\n\n if (this._queuedEntries.length) {\n this._callback(this.takeRecords(), this);\n }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} rootRect The bounding rect of the root after being\n * expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n * intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n function(target, rootRect) {\n\n // If the element isn't displayed, an intersection can't happen.\n if (window.getComputedStyle(target).display == 'none') return;\n\n var targetRect = getBoundingClientRect(target);\n var intersectionRect = targetRect;\n var parent = getParentNode(target);\n var atRoot = false;\n\n while (!atRoot) {\n var parentRect = null;\n var parentComputedStyle = parent.nodeType == 1 ?\n window.getComputedStyle(parent) : {};\n\n // If the parent isn't displayed, an intersection can't happen.\n if (parentComputedStyle.display == 'none') return;\n\n if (parent == this.root || parent == document) {\n atRoot = true;\n parentRect = rootRect;\n } else {\n // If the element has a non-visible overflow, and it's not the <body>\n // or <html> element, update the intersection rect.\n // Note: <body> and <html> cannot be clipped to a rect that's not also\n // the document rect, so no need to compute a new intersection.\n if (parent != document.body &&\n parent != document.documentElement &&\n parentComputedStyle.overflow != 'visible') {\n parentRect = getBoundingClientRect(parent);\n }\n }\n\n // If either of the above conditionals set a new parentRect,\n // calculate new intersection data.\n if (parentRect) {\n intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n\n if (!intersectionRect) break;\n }\n parent = getParentNode(parent);\n }\n return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {Object} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n var rootRect;\n if (this.root) {\n rootRect = getBoundingClientRect(this.root);\n } else {\n // Use <html>/<body> instead of window since scroll bars affect size.\n var html = document.documentElement;\n var body = document.body;\n rootRect = {\n top: 0,\n left: 0,\n right: html.clientWidth || body.clientWidth,\n width: html.clientWidth || body.clientWidth,\n bottom: html.clientHeight || body.clientHeight,\n height: html.clientHeight || body.clientHeight\n };\n }\n return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {Object} rect The rect object to expand.\n * @return {Object} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n var margins = this._rootMarginValues.map(function(margin, i) {\n return margin.unit == 'px' ? margin.value :\n margin.value * (i % 2 ? rect.width : rect.height) / 100;\n });\n var newRect = {\n top: rect.top - margins[0],\n right: rect.right + margins[1],\n bottom: rect.bottom + margins[2],\n left: rect.left - margins[3]\n };\n newRect.width = newRect.right - newRect.left;\n newRect.height = newRect.bottom - newRect.top;\n\n return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n * particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n * particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n function(oldEntry, newEntry) {\n\n // To make comparing easier, an entry that has a ratio of 0\n // but does not actually intersect is given a value of -1\n var oldRatio = oldEntry && oldEntry.isIntersecting ?\n oldEntry.intersectionRatio || 0 : -1;\n var newRatio = newEntry.isIntersecting ?\n newEntry.intersectionRatio || 0 : -1;\n\n // Ignore unchanged ratios\n if (oldRatio === newRatio) return;\n\n for (var i = 0; i < this.thresholds.length; i++) {\n var threshold = this.thresholds[i];\n\n // Return true if an entry matches a threshold or if the new ratio\n // and the old ratio are on the opposite sides of a threshold.\n if (threshold == oldRatio || threshold == newRatio ||\n threshold < oldRatio !== threshold < newRatio) {\n return true;\n }\n }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n return containsDeep(this.root || document, target);\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n if (registry.indexOf(this) < 0) {\n registry.push(this);\n }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n var index = registry.indexOf(this);\n if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n * function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n var timer = null;\n return function () {\n if (!timer) {\n timer = setTimeout(function() {\n fn();\n timer = null;\n }, timeout);\n }\n };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n * phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n if (typeof node.addEventListener == 'function') {\n node.addEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.attachEvent == 'function') {\n node.attachEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n * flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n if (typeof node.removeEventListener == 'function') {\n node.removeEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.detatchEvent == 'function') {\n node.detatchEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object} The intersection rect or undefined if no intersection\n * is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n var top = Math.max(rect1.top, rect2.top);\n var bottom = Math.min(rect1.bottom, rect2.bottom);\n var left = Math.max(rect1.left, rect2.left);\n var right = Math.min(rect1.right, rect2.right);\n var width = right - left;\n var height = bottom - top;\n\n return (width >= 0 && height >= 0) && {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {Object} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n var rect;\n\n try {\n rect = el.getBoundingClientRect();\n } catch (err) {\n // Ignore Windows 7 IE11 \"Unspecified error\"\n // https://github.com/w3c/IntersectionObserver/pull/205\n }\n\n if (!rect) return getEmptyRect();\n\n // Older IE\n if (!(rect.width && rect.height)) {\n rect = {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n }\n return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {Object} The empty rect.\n */\nfunction getEmptyRect() {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n width: 0,\n height: 0\n };\n}\n\n/**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n var node = child;\n while (node) {\n if (node == parent) return true;\n\n node = getParentNode(node);\n }\n return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n var parent = node.parentNode;\n\n if (parent && parent.nodeType == 11 && parent.host) {\n // If the parent is a shadow root, return the host element.\n return parent.host;\n }\n return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}(window, document));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcz81YWJlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgVzNDIFNPRlRXQVJFIEFORCBET0NVTUVOVCBOT1RJQ0UgQU5EIExJQ0VOU0UuXG4gKlxuICogIGh0dHBzOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMTUvY29weXJpZ2h0LXNvZnR3YXJlLWFuZC1kb2N1bWVudFxuICpcbiAqL1xuXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIEV4aXRzIGVhcmx5IGlmIGFsbCBJbnRlcnNlY3Rpb25PYnNlcnZlciBhbmQgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVxuLy8gZmVhdHVyZXMgYXJlIG5hdGl2ZWx5IHN1cHBvcnRlZC5cbmlmICgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyAmJlxuICAgICdJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5JyBpbiB3aW5kb3cgJiZcbiAgICAnaW50ZXJzZWN0aW9uUmF0aW8nIGluIHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSkge1xuXG4gIC8vIE1pbmltYWwgcG9seWZpbGwgZm9yIEVkZ2UgMTUncyBsYWNrIG9mIGBpc0ludGVyc2VjdGluZ2BcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL2lzc3Vlcy8yMTFcbiAgaWYgKCEoJ2lzSW50ZXJzZWN0aW5nJyBpbiB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeS5wcm90b3R5cGUpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSxcbiAgICAgICdpc0ludGVyc2VjdGluZycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb25SYXRpbyA+IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5cbi8qKlxuICogQW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkuIFRoaXMgcmVnaXN0cnkgZXhpc3RzIHRvIGhvbGQgYSBzdHJvbmdcbiAqIHJlZmVyZW5jZSB0byBJbnRlcnNlY3Rpb25PYnNlcnZlciBpbnN0YW5jZXMgY3VycmVudGx5IG9ic2VydmluZyBhIHRhcmdldFxuICogZWxlbWVudC4gV2l0aG91dCB0aGlzIHJlZ2lzdHJ5LCBpbnN0YW5jZXMgd2l0aG91dCBhbm90aGVyIHJlZmVyZW5jZSBtYXkgYmVcbiAqIGdhcmJhZ2UgY29sbGVjdGVkLlxuICovXG52YXIgcmVnaXN0cnkgPSBbXTtcblxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5IGNvbnN0cnVjdG9yLlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ludGVyc2VjdGlvbk9ic2VydmVyLyNpbnRlcnNlY3Rpb24tb2JzZXJ2ZXItZW50cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRyeSBBIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgcHJvcGVydGllcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5KGVudHJ5KSB7XG4gIHRoaXMudGltZSA9IGVudHJ5LnRpbWU7XG4gIHRoaXMudGFyZ2V0ID0gZW50cnkudGFyZ2V0O1xuICB0aGlzLnJvb3RCb3VuZHMgPSBlbnRyeS5yb290Qm91bmRzO1xuICB0aGlzLmJvdW5kaW5nQ2xpZW50UmVjdCA9IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdDtcbiAgdGhpcy5pbnRlcnNlY3Rpb25SZWN0ID0gZW50cnkuaW50ZXJzZWN0aW9uUmVjdCB8fCBnZXRFbXB0eVJlY3QoKTtcbiAgdGhpcy5pc0ludGVyc2VjdGluZyA9ICEhZW50cnkuaW50ZXJzZWN0aW9uUmVjdDtcblxuICAvLyBDYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gcmF0aW8uXG4gIHZhciB0YXJnZXRSZWN0ID0gdGhpcy5ib3VuZGluZ0NsaWVudFJlY3Q7XG4gIHZhciB0YXJnZXRBcmVhID0gdGFyZ2V0UmVjdC53aWR0aCAqIHRhcmdldFJlY3QuaGVpZ2h0O1xuICB2YXIgaW50ZXJzZWN0aW9uUmVjdCA9IHRoaXMuaW50ZXJzZWN0aW9uUmVjdDtcbiAgdmFyIGludGVyc2VjdGlvbkFyZWEgPSBpbnRlcnNlY3Rpb25SZWN0LndpZHRoICogaW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQ7XG5cbiAgLy8gU2V0cyBpbnRlcnNlY3Rpb24gcmF0aW8uXG4gIGlmICh0YXJnZXRBcmVhKSB7XG4gICAgLy8gUm91bmQgdGhlIGludGVyc2VjdGlvbiByYXRpbyB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBtYXRoIGlzc3VlczpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL2lzc3Vlcy8zMjRcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gTnVtYmVyKChpbnRlcnNlY3Rpb25BcmVhIC8gdGFyZ2V0QXJlYSkudG9GaXhlZCg0KSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYXJlYSBpcyB6ZXJvIGFuZCBpcyBpbnRlcnNlY3RpbmcsIHNldHMgdG8gMSwgb3RoZXJ3aXNlIHRvIDBcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gdGhpcy5pc0ludGVyc2VjdGluZyA/IDEgOiAwO1xuICB9XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY29uc3RydWN0b3IuXG4gKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2ludGVyc2VjdGlvbi1vYnNlcnZlci1pbnRlcmZhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIGludGVyc2VjdGlvblxuICogICAgIGNoYW5nZXMgaGF2ZSBxdWV1ZWQuIFRoZSBmdW5jdGlvbiBpcyBub3QgaW52b2tlZCBpZiB0aGUgcXVldWUgaGFzXG4gKiAgICAgYmVlbiBlbXB0aWVkIGJ5IGNhbGxpbmcgdGhlIGB0YWtlUmVjb3Jkc2AgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRfb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdF9vcHRpb25zKSB7XG5cbiAgdmFyIG9wdGlvbnMgPSBvcHRfb3B0aW9ucyB8fCB7fTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucm9vdCAmJiBvcHRpb25zLnJvb3Qubm9kZVR5cGUgIT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCBtdXN0IGJlIGFuIEVsZW1lbnQnKTtcbiAgfVxuXG4gIC8vIEJpbmRzIGFuZCB0aHJvdHRsZXMgYHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9uc2AuXG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyA9IHRocm90dGxlKFxuICAgICAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLmJpbmQodGhpcyksIHRoaXMuVEhST1RUTEVfVElNRU9VVCk7XG5cbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzLlxuICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICB0aGlzLl9yb290TWFyZ2luVmFsdWVzID0gdGhpcy5fcGFyc2VSb290TWFyZ2luKG9wdGlvbnMucm9vdE1hcmdpbik7XG5cbiAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gIHRoaXMudGhyZXNob2xkcyA9IHRoaXMuX2luaXRUaHJlc2hvbGRzKG9wdGlvbnMudGhyZXNob2xkKTtcbiAgdGhpcy5yb290ID0gb3B0aW9ucy5yb290IHx8IG51bGw7XG4gIHRoaXMucm9vdE1hcmdpbiA9IHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMubWFwKGZ1bmN0aW9uKG1hcmdpbikge1xuICAgIHJldHVybiBtYXJnaW4udmFsdWUgKyBtYXJnaW4udW5pdDtcbiAgfSkuam9pbignICcpO1xufVxuXG5cbi8qKlxuICogVGhlIG1pbmltdW0gaW50ZXJ2YWwgd2l0aGluIHdoaWNoIHRoZSBkb2N1bWVudCB3aWxsIGJlIGNoZWNrZWQgZm9yXG4gKiBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlRIUk9UVExFX1RJTUVPVVQgPSAxMDA7XG5cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGluIHdoaWNoIHRoZSBwb2x5ZmlsbCBwb2xscyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiB0aGlzIGNhbiBiZSB1cGRhdGVkIG9uIGEgcGVyIGluc3RhbmNlIGJhc2lzIGFuZCBtdXN0IGJlIHNldCBwcmlvciB0b1xuICogY2FsbGluZyBgb2JzZXJ2ZWAgb24gdGhlIGZpcnN0IHRhcmdldC5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlBPTExfSU5URVJWQUwgPSBudWxsO1xuXG4vKipcbiAqIFVzZSBhIG11dGF0aW9uIG9ic2VydmVyIG9uIHRoZSByb290IGVsZW1lbnRcbiAqIHRvIGRldGVjdCBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlVTRV9NVVRBVElPTl9PQlNFUlZFUiA9IHRydWU7XG5cblxuLyoqXG4gKiBTdGFydHMgb2JzZXJ2aW5nIGEgdGFyZ2V0IGVsZW1lbnQgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzIGJhc2VkIG9uXG4gKiB0aGUgdGhyZXNob2xkcyB2YWx1ZXMuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgRE9NIGVsZW1lbnQgdG8gb2JzZXJ2ZS5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgdmFyIGlzVGFyZ2V0QWxyZWFkeU9ic2VydmVkID0gdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgPT0gdGFyZ2V0O1xuICB9KTtcblxuICBpZiAoaXNUYXJnZXRBbHJlYWR5T2JzZXJ2ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBFbGVtZW50Jyk7XG4gIH1cblxuICB0aGlzLl9yZWdpc3Rlckluc3RhbmNlKCk7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5wdXNoKHtlbGVtZW50OiB0YXJnZXQsIGVudHJ5OiBudWxsfSk7XG4gIHRoaXMuX21vbml0b3JJbnRlcnNlY3Rpb25zKCk7XG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucygpO1xufTtcblxuXG4vKipcbiAqIFN0b3BzIG9ic2VydmluZyBhIHRhcmdldCBlbGVtZW50IGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUudW5vYnNlcnZlID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9XG4gICAgICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgIT0gdGFyZ2V0O1xuICB9KTtcbiAgaWYgKCF0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMubGVuZ3RoKSB7XG4gICAgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpO1xuICAgIHRoaXMuX3VucmVnaXN0ZXJJbnN0YW5jZSgpO1xuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgb2JzZXJ2aW5nIGFsbCB0YXJnZXQgZWxlbWVudHMgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpO1xuICB0aGlzLl91bnJlZ2lzdGVySW5zdGFuY2UoKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFueSBxdWV1ZSBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVwb3J0ZWQgdG8gdGhlXG4gKiBjYWxsYmFjayBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICogY2FsbGJhY2sgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBtb3N0IHVwLXRvLWRhdGUgaW50ZXJzZWN0aW9uIGluZm9ybWF0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjdXJyZW50bHkgcXVldWVkIGVudHJpZXMuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS50YWtlUmVjb3JkcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVjb3JkcyA9IHRoaXMuX3F1ZXVlZEVudHJpZXMuc2xpY2UoKTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICByZXR1cm4gcmVjb3Jkcztcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZnJvbSB0aGUgdXNlciBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcbiAqIHJldHVybnMgYSBzb3J0ZWQgYXJyYXkgb2YgdW5pcXVlIHRocmVzaG9sZCB2YWx1ZXMuIElmIGEgdmFsdWUgaXMgbm90XG4gKiBiZXR3ZWVuIDAgYW5kIDEgYW5kIGVycm9yIGlzIHRocm93bi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fG51bWJlcj19IG9wdF90aHJlc2hvbGQgQW4gb3B0aW9uYWwgdGhyZXNob2xkIHZhbHVlIG9yXG4gKiAgICAgYSBsaXN0IG9mIHRocmVzaG9sZCB2YWx1ZXMsIGRlZmF1bHRpbmcgdG8gWzBdLlxuICogQHJldHVybiB7QXJyYXl9IEEgc29ydGVkIGxpc3Qgb2YgdW5pcXVlIGFuZCB2YWxpZCB0aHJlc2hvbGQgdmFsdWVzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2luaXRUaHJlc2hvbGRzID0gZnVuY3Rpb24ob3B0X3RocmVzaG9sZCkge1xuICB2YXIgdGhyZXNob2xkID0gb3B0X3RocmVzaG9sZCB8fCBbMF07XG4gIGlmICghQXJyYXkuaXNBcnJheSh0aHJlc2hvbGQpKSB0aHJlc2hvbGQgPSBbdGhyZXNob2xkXTtcblxuICByZXR1cm4gdGhyZXNob2xkLnNvcnQoKS5maWx0ZXIoZnVuY3Rpb24odCwgaSwgYSkge1xuICAgIGlmICh0eXBlb2YgdCAhPSAnbnVtYmVyJyB8fCBpc05hTih0KSB8fCB0IDwgMCB8fCB0ID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlbHknKTtcbiAgICB9XG4gICAgcmV0dXJuIHQgIT09IGFbaSAtIDFdO1xuICB9KTtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSByb290TWFyZ2luIHZhbHVlIGZyb20gdGhlIHVzZXIgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBmb3VyIG1hcmdpbiB2YWx1ZXMgYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmdcbiAqIHRoZSB2YWx1ZSBhbmQgdW5pdCBwcm9wZXJ0aWVzLiBJZiBhbnkgb2YgdGhlIHZhbHVlcyBhcmUgbm90IHByb3Blcmx5XG4gKiBmb3JtYXR0ZWQgb3IgdXNlIGEgdW5pdCBvdGhlciB0aGFuIHB4IG9yICUsIGFuZCBlcnJvciBpcyB0aHJvd24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRfcm9vdE1hcmdpbiBBbiBvcHRpb25hbCByb290TWFyZ2luIHZhbHVlLFxuICogICAgIGRlZmF1bHRpbmcgdG8gJzBweCcuXG4gKiBAcmV0dXJuIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBtYXJnaW4gb2JqZWN0cyB3aXRoIHRoZSBrZXlzXG4gKiAgICAgdmFsdWUgYW5kIHVuaXQuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcGFyc2VSb290TWFyZ2luID0gZnVuY3Rpb24ob3B0X3Jvb3RNYXJnaW4pIHtcbiAgdmFyIG1hcmdpblN0cmluZyA9IG9wdF9yb290TWFyZ2luIHx8ICcwcHgnO1xuICB2YXIgbWFyZ2lucyA9IG1hcmdpblN0cmluZy5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihtYXJnaW4pIHtcbiAgICB2YXIgcGFydHMgPSAvXigtP1xcZCpcXC4/XFxkKykocHh8JSkkLy5leGVjKG1hcmdpbik7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290TWFyZ2luIG11c3QgYmUgc3BlY2lmaWVkIGluIHBpeGVscyBvciBwZXJjZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IHBhcnNlRmxvYXQocGFydHNbMV0pLCB1bml0OiBwYXJ0c1syXX07XG4gIH0pO1xuXG4gIC8vIEhhbmRsZXMgc2hvcnRoYW5kLlxuICBtYXJnaW5zWzFdID0gbWFyZ2luc1sxXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzJdID0gbWFyZ2luc1syXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzNdID0gbWFyZ2luc1szXSB8fCBtYXJnaW5zWzFdO1xuXG4gIHJldHVybiBtYXJnaW5zO1xufTtcblxuXG4vKipcbiAqIFN0YXJ0cyBwb2xsaW5nIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcyBpZiB0aGUgcG9sbGluZyBpcyBub3QgYWxyZWFkeVxuICogaGFwcGVuaW5nLCBhbmQgaWYgdGhlIHBhZ2UncyB2aXNpYmlsaXR5IHN0YXRlIGlzIHZpc2libGUuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX21vbml0b3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fbW9uaXRvcmluZ0ludGVyc2VjdGlvbnMpIHtcbiAgICB0aGlzLl9tb25pdG9yaW5nSW50ZXJzZWN0aW9ucyA9IHRydWU7XG5cbiAgICAvLyBJZiBhIHBvbGwgaW50ZXJ2YWwgaXMgc2V0LCB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlc2l6ZSBhbmQgc2Nyb2xsIGV2ZW50cyBvciBET00gbXV0YXRpb25zLlxuICAgIGlmICh0aGlzLlBPTExfSU5URVJWQUwpIHtcbiAgICAgIHRoaXMuX21vbml0b3JpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKFxuICAgICAgICAgIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgdGhpcy5QT0xMX0lOVEVSVkFMKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhZGRFdmVudCh3aW5kb3csICdyZXNpemUnLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsIHRydWUpO1xuICAgICAgYWRkRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsIHRydWUpO1xuXG4gICAgICBpZiAodGhpcy5VU0VfTVVUQVRJT05fT0JTRVJWRVIgJiYgJ011dGF0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdykge1xuICAgICAgICB0aGlzLl9kb21PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvbU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgcG9sbGluZyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3VubW9uaXRvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX21vbml0b3JpbmdJbnRlcnNlY3Rpb25zKSB7XG4gICAgdGhpcy5fbW9uaXRvcmluZ0ludGVyc2VjdGlvbnMgPSBmYWxzZTtcblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbW9uaXRvcmluZ0ludGVydmFsKTtcbiAgICB0aGlzLl9tb25pdG9yaW5nSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgcmVtb3ZlRXZlbnQod2luZG93LCAncmVzaXplJywgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLCB0cnVlKTtcbiAgICByZW1vdmVFdmVudChkb2N1bWVudCwgJ3Njcm9sbCcsIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5fZG9tT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2RvbU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuX2RvbU9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTY2FucyBlYWNoIG9ic2VydmF0aW9uIHRhcmdldCBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMgYW5kIGFkZHMgdGhlbVxuICogdG8gdGhlIGludGVybmFsIGVudHJpZXMgcXVldWUuIElmIG5ldyBlbnRyaWVzIGFyZSBmb3VuZCwgaXRcbiAqIHNjaGVkdWxlcyB0aGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oKSB7XG4gIHZhciByb290SXNJbkRvbSA9IHRoaXMuX3Jvb3RJc0luRG9tKCk7XG4gIHZhciByb290UmVjdCA9IHJvb3RJc0luRG9tID8gdGhpcy5fZ2V0Um9vdFJlY3QoKSA6IGdldEVtcHR5UmVjdCgpO1xuXG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbGVtZW50O1xuICAgIHZhciB0YXJnZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRhcmdldCk7XG4gICAgdmFyIHJvb3RDb250YWluc1RhcmdldCA9IHRoaXMuX3Jvb3RDb250YWluc1RhcmdldCh0YXJnZXQpO1xuICAgIHZhciBvbGRFbnRyeSA9IGl0ZW0uZW50cnk7XG4gICAgdmFyIGludGVyc2VjdGlvblJlY3QgPSByb290SXNJbkRvbSAmJiByb290Q29udGFpbnNUYXJnZXQgJiZcbiAgICAgICAgdGhpcy5fY29tcHV0ZVRhcmdldEFuZFJvb3RJbnRlcnNlY3Rpb24odGFyZ2V0LCByb290UmVjdCk7XG5cbiAgICB2YXIgbmV3RW50cnkgPSBpdGVtLmVudHJ5ID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkoe1xuICAgICAgdGltZTogbm93KCksXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIGJvdW5kaW5nQ2xpZW50UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgIHJvb3RCb3VuZHM6IHJvb3RSZWN0LFxuICAgICAgaW50ZXJzZWN0aW9uUmVjdDogaW50ZXJzZWN0aW9uUmVjdFxuICAgIH0pO1xuXG4gICAgaWYgKCFvbGRFbnRyeSkge1xuICAgICAgdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICB9IGVsc2UgaWYgKHJvb3RJc0luRG9tICYmIHJvb3RDb250YWluc1RhcmdldCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBlbnRyeSBpbnRlcnNlY3Rpb24gcmF0aW8gaGFzIGNyb3NzZWQgYW55IG9mIHRoZVxuICAgICAgLy8gdGhyZXNob2xkcywgYWRkIGEgbmV3IGVudHJ5LlxuICAgICAgaWYgKHRoaXMuX2hhc0Nyb3NzZWRUaHJlc2hvbGQob2xkRW50cnksIG5ld0VudHJ5KSkge1xuICAgICAgICB0aGlzLl9xdWV1ZWRFbnRyaWVzLnB1c2gobmV3RW50cnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgcm9vdCBpcyBub3QgaW4gdGhlIERPTSBvciB0YXJnZXQgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW5cbiAgICAgIC8vIHJvb3QgYnV0IHRoZSBwcmV2aW91cyBlbnRyeSBmb3IgdGhpcyB0YXJnZXQgaGFkIGFuIGludGVyc2VjdGlvbixcbiAgICAgIC8vIGFkZCBhIG5ldyByZWNvcmQgaW5kaWNhdGluZyByZW1vdmFsLlxuICAgICAgaWYgKG9sZEVudHJ5ICYmIG9sZEVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZEVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0aGlzKTtcblxuICBpZiAodGhpcy5fcXVldWVkRW50cmllcy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFjayh0aGlzLnRha2VSZWNvcmRzKCksIHRoaXMpO1xuICB9XG59O1xuXG5cbi8qKlxuICogQWNjZXB0cyBhIHRhcmdldCBhbmQgcm9vdCByZWN0IGNvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGVuXG4gKiBmb2xsb3dpbmcgdGhlIGFsZ29yaXRobSBpbiB0aGUgc3BlYy5cbiAqIFRPRE8ocGhpbGlwd2FsdG9uKTogYXQgdGhpcyB0aW1lIGNsaXAtcGF0aCBpcyBub3QgY29uc2lkZXJlZC5cbiAqIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9JbnRlcnNlY3Rpb25PYnNlcnZlci8jY2FsY3VsYXRlLWludGVyc2VjdGlvbi1yZWN0LWFsZ29cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSB0YXJnZXQgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSByb290UmVjdCBUaGUgYm91bmRpbmcgcmVjdCBvZiB0aGUgcm9vdCBhZnRlciBiZWluZ1xuICogICAgIGV4cGFuZGVkIGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHJldHVybiB7P09iamVjdH0gVGhlIGZpbmFsIGludGVyc2VjdGlvbiByZWN0IG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm9cbiAqICAgICBpbnRlcnNlY3Rpb24gaXMgZm91bmQuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2NvbXB1dGVUYXJnZXRBbmRSb290SW50ZXJzZWN0aW9uID1cbiAgICBmdW5jdGlvbih0YXJnZXQsIHJvb3RSZWN0KSB7XG5cbiAgLy8gSWYgdGhlIGVsZW1lbnQgaXNuJ3QgZGlzcGxheWVkLCBhbiBpbnRlcnNlY3Rpb24gY2FuJ3QgaGFwcGVuLlxuICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5kaXNwbGF5ID09ICdub25lJykgcmV0dXJuO1xuXG4gIHZhciB0YXJnZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRhcmdldCk7XG4gIHZhciBpbnRlcnNlY3Rpb25SZWN0ID0gdGFyZ2V0UmVjdDtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudE5vZGUodGFyZ2V0KTtcbiAgdmFyIGF0Um9vdCA9IGZhbHNlO1xuXG4gIHdoaWxlICghYXRSb290KSB7XG4gICAgdmFyIHBhcmVudFJlY3QgPSBudWxsO1xuICAgIHZhciBwYXJlbnRDb21wdXRlZFN0eWxlID0gcGFyZW50Lm5vZGVUeXBlID09IDEgP1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpIDoge307XG5cbiAgICAvLyBJZiB0aGUgcGFyZW50IGlzbid0IGRpc3BsYXllZCwgYW4gaW50ZXJzZWN0aW9uIGNhbid0IGhhcHBlbi5cbiAgICBpZiAocGFyZW50Q29tcHV0ZWRTdHlsZS5kaXNwbGF5ID09ICdub25lJykgcmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudCA9PSB0aGlzLnJvb3QgfHwgcGFyZW50ID09IGRvY3VtZW50KSB7XG4gICAgICBhdFJvb3QgPSB0cnVlO1xuICAgICAgcGFyZW50UmVjdCA9IHJvb3RSZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBub24tdmlzaWJsZSBvdmVyZmxvdywgYW5kIGl0J3Mgbm90IHRoZSA8Ym9keT5cbiAgICAgIC8vIG9yIDxodG1sPiBlbGVtZW50LCB1cGRhdGUgdGhlIGludGVyc2VjdGlvbiByZWN0LlxuICAgICAgLy8gTm90ZTogPGJvZHk+IGFuZCA8aHRtbD4gY2Fubm90IGJlIGNsaXBwZWQgdG8gYSByZWN0IHRoYXQncyBub3QgYWxzb1xuICAgICAgLy8gdGhlIGRvY3VtZW50IHJlY3QsIHNvIG5vIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBpbnRlcnNlY3Rpb24uXG4gICAgICBpZiAocGFyZW50ICE9IGRvY3VtZW50LmJvZHkgJiZcbiAgICAgICAgICBwYXJlbnQgIT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmXG4gICAgICAgICAgcGFyZW50Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPSAndmlzaWJsZScpIHtcbiAgICAgICAgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBvZiB0aGUgYWJvdmUgY29uZGl0aW9uYWxzIHNldCBhIG5ldyBwYXJlbnRSZWN0LFxuICAgIC8vIGNhbGN1bGF0ZSBuZXcgaW50ZXJzZWN0aW9uIGRhdGEuXG4gICAgaWYgKHBhcmVudFJlY3QpIHtcbiAgICAgIGludGVyc2VjdGlvblJlY3QgPSBjb21wdXRlUmVjdEludGVyc2VjdGlvbihwYXJlbnRSZWN0LCBpbnRlcnNlY3Rpb25SZWN0KTtcblxuICAgICAgaWYgKCFpbnRlcnNlY3Rpb25SZWN0KSBicmVhaztcbiAgICB9XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25SZWN0O1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3QgcmVjdCBhZnRlciBiZWluZyBleHBhbmRlZCBieSB0aGUgcm9vdE1hcmdpbiB2YWx1ZS5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGV4cGFuZGVkIHJvb3QgcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fZ2V0Um9vdFJlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3RSZWN0O1xuICBpZiAodGhpcy5yb290KSB7XG4gICAgcm9vdFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy5yb290KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgPGh0bWw+Lzxib2R5PiBpbnN0ZWFkIG9mIHdpbmRvdyBzaW5jZSBzY3JvbGwgYmFycyBhZmZlY3Qgc2l6ZS5cbiAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgcm9vdFJlY3QgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IGh0bWwuY2xpZW50V2lkdGggfHwgYm9keS5jbGllbnRXaWR0aCxcbiAgICAgIHdpZHRoOiBodG1sLmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50V2lkdGgsXG4gICAgICBib3R0b206IGh0bWwuY2xpZW50SGVpZ2h0IHx8IGJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgaGVpZ2h0OiBodG1sLmNsaWVudEhlaWdodCB8fCBib2R5LmNsaWVudEhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2V4cGFuZFJlY3RCeVJvb3RNYXJnaW4ocm9vdFJlY3QpO1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgYSByZWN0IGFuZCBleHBhbmRzIGl0IGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHBhcmFtIHtPYmplY3R9IHJlY3QgVGhlIHJlY3Qgb2JqZWN0IHRvIGV4cGFuZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGV4cGFuZGVkIHJlY3QuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2V4cGFuZFJlY3RCeVJvb3RNYXJnaW4gPSBmdW5jdGlvbihyZWN0KSB7XG4gIHZhciBtYXJnaW5zID0gdGhpcy5fcm9vdE1hcmdpblZhbHVlcy5tYXAoZnVuY3Rpb24obWFyZ2luLCBpKSB7XG4gICAgcmV0dXJuIG1hcmdpbi51bml0ID09ICdweCcgPyBtYXJnaW4udmFsdWUgOlxuICAgICAgICBtYXJnaW4udmFsdWUgKiAoaSAlIDIgPyByZWN0LndpZHRoIDogcmVjdC5oZWlnaHQpIC8gMTAwO1xuICB9KTtcbiAgdmFyIG5ld1JlY3QgPSB7XG4gICAgdG9wOiByZWN0LnRvcCAtIG1hcmdpbnNbMF0sXG4gICAgcmlnaHQ6IHJlY3QucmlnaHQgKyBtYXJnaW5zWzFdLFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20gKyBtYXJnaW5zWzJdLFxuICAgIGxlZnQ6IHJlY3QubGVmdCAtIG1hcmdpbnNbM11cbiAgfTtcbiAgbmV3UmVjdC53aWR0aCA9IG5ld1JlY3QucmlnaHQgLSBuZXdSZWN0LmxlZnQ7XG4gIG5ld1JlY3QuaGVpZ2h0ID0gbmV3UmVjdC5ib3R0b20gLSBuZXdSZWN0LnRvcDtcblxuICByZXR1cm4gbmV3UmVjdDtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIGFuIG9sZCBhbmQgbmV3IGVudHJ5IGFuZCByZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZVxuICogdGhyZXNob2xkIHZhbHVlcyBoYXMgYmVlbiBjcm9zc2VkLlxuICogQHBhcmFtIHs/SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeX0gb2xkRW50cnkgVGhlIHByZXZpb3VzIGVudHJ5IGZvciBhXG4gKiAgICBwYXJ0aWN1bGFyIHRhcmdldCBlbGVtZW50IG9yIG51bGwgaWYgbm8gcHJldmlvdXMgZW50cnkgZXhpc3RzLlxuICogQHBhcmFtIHtJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5fSBuZXdFbnRyeSBUaGUgY3VycmVudCBlbnRyeSBmb3IgYVxuICogICAgcGFydGljdWxhciB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhIGFueSB0aHJlc2hvbGQgaGFzIGJlZW4gY3Jvc3NlZC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5faGFzQ3Jvc3NlZFRocmVzaG9sZCA9XG4gICAgZnVuY3Rpb24ob2xkRW50cnksIG5ld0VudHJ5KSB7XG5cbiAgLy8gVG8gbWFrZSBjb21wYXJpbmcgZWFzaWVyLCBhbiBlbnRyeSB0aGF0IGhhcyBhIHJhdGlvIG9mIDBcbiAgLy8gYnV0IGRvZXMgbm90IGFjdHVhbGx5IGludGVyc2VjdCBpcyBnaXZlbiBhIHZhbHVlIG9mIC0xXG4gIHZhciBvbGRSYXRpbyA9IG9sZEVudHJ5ICYmIG9sZEVudHJ5LmlzSW50ZXJzZWN0aW5nID9cbiAgICAgIG9sZEVudHJ5LmludGVyc2VjdGlvblJhdGlvIHx8IDAgOiAtMTtcbiAgdmFyIG5ld1JhdGlvID0gbmV3RW50cnkuaXNJbnRlcnNlY3RpbmcgP1xuICAgICAgbmV3RW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gfHwgMCA6IC0xO1xuXG4gIC8vIElnbm9yZSB1bmNoYW5nZWQgcmF0aW9zXG4gIGlmIChvbGRSYXRpbyA9PT0gbmV3UmF0aW8pIHJldHVybjtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGhyZXNob2xkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0aHJlc2hvbGQgPSB0aGlzLnRocmVzaG9sZHNbaV07XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlbnRyeSBtYXRjaGVzIGEgdGhyZXNob2xkIG9yIGlmIHRoZSBuZXcgcmF0aW9cbiAgICAvLyBhbmQgdGhlIG9sZCByYXRpbyBhcmUgb24gdGhlIG9wcG9zaXRlIHNpZGVzIG9mIGEgdGhyZXNob2xkLlxuICAgIGlmICh0aHJlc2hvbGQgPT0gb2xkUmF0aW8gfHwgdGhyZXNob2xkID09IG5ld1JhdGlvIHx8XG4gICAgICAgIHRocmVzaG9sZCA8IG9sZFJhdGlvICE9PSB0aHJlc2hvbGQgPCBuZXdSYXRpbykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcm9vdCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgYW5kIGlzIGluIHRoZSBET00uXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSByb290IGVsZW1lbnQgaXMgYW4gZWxlbWVudCBhbmQgaXMgaW4gdGhlIERPTS5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcm9vdElzSW5Eb20gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLnJvb3QgfHwgY29udGFpbnNEZWVwKGRvY3VtZW50LCB0aGlzLnJvb3QpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2Ygcm9vdC5cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2Ygcm9vdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcm9vdENvbnRhaW5zVGFyZ2V0ID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gIHJldHVybiBjb250YWluc0RlZXAodGhpcy5yb290IHx8IGRvY3VtZW50LCB0YXJnZXQpO1xufTtcblxuXG4vKipcbiAqIEFkZHMgdGhlIGluc3RhbmNlIHRvIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkgaWYgaXQgaXNuJ3RcbiAqIGFscmVhZHkgcHJlc2VudC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocmVnaXN0cnkuaW5kZXhPZih0aGlzKSA8IDApIHtcbiAgICByZWdpc3RyeS5wdXNoKHRoaXMpO1xuICB9XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZ2xvYmFsIEludGVyc2VjdGlvbk9ic2VydmVyIHJlZ2lzdHJ5LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl91bnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluZGV4ID0gcmVnaXN0cnkuaW5kZXhPZih0aGlzKTtcbiAgaWYgKGluZGV4ICE9IC0xKSByZWdpc3RyeS5zcGxpY2UoaW5kZXgsIDEpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcGVyZm9ybWFuY2Uubm93KCkgbWV0aG9kIG9yIG51bGwgaW4gYnJvd3NlcnNcbiAqIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgQVBJLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWxhcHNlZCB0aW1lIHNpbmNlIHRoZSBwYWdlIHdhcyByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS5ub3cgJiYgcGVyZm9ybWFuY2Uubm93KCk7XG59XG5cblxuLyoqXG4gKiBUaHJvdHRsZXMgYSBmdW5jdGlvbiBhbmQgZGVsYXlzIGl0cyBleGVjdXRpb24sIHNvIGl0J3Mgb25seSBjYWxsZWQgYXQgbW9zdFxuICogb25jZSB3aXRoaW4gYSBnaXZlbiB0aW1lIHBlcmlvZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IG11c3QgcGFzcyBiZWZvcmUgdGhlXG4gKiAgICAgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhZ2Fpbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgdGltZW91dCkge1xuICB2YXIgdGltZXIgPSBudWxsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGltZXIpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgZm4oKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9O1xufVxuXG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBoYW5kbGVyIHRvIGEgRE9NIG5vZGUgZW5zdXJpbmcgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBET00gbm9kZSB0byBhZGQgdGhlIGV2ZW50IGhhbmRsZXIgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZXZlbnQgaGFuZGxlciB0byBhZGQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF91c2VDYXB0dXJlIE9wdGlvbmFsbHkgYWRkcyB0aGUgZXZlbiB0byB0aGUgY2FwdHVyZVxuICogICAgIHBoYXNlLiBOb3RlOiB0aGlzIG9ubHkgd29ya3MgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICovXG5mdW5jdGlvbiBhZGRFdmVudChub2RlLCBldmVudCwgZm4sIG9wdF91c2VDYXB0dXJlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZS5hZGRFdmVudExpc3RlbmVyID09ICdmdW5jdGlvbicpIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSB8fCBmYWxzZSk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIG5vZGUuYXR0YWNoRXZlbnQgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5vZGUuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBmbik7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIGV2ZW50IGhhbmRsZXIgZnJvbSBhIERPTSBub2RlLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBET00gbm9kZSB0byByZW1vdmUgdGhlIGV2ZW50IGhhbmRsZXIgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBldmVudCBoYW5kbGVyIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0X3VzZUNhcHR1cmUgSWYgdGhlIGV2ZW50IGhhbmRsZXIgd2FzIGFkZGVkIHdpdGggdGhpc1xuICogICAgIGZsYWcgc2V0IHRvIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBoZXJlIGluIG9yZGVyIHRvIHJlbW92ZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnQobm9kZSwgZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSkge1xuICBpZiAodHlwZW9mIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgb3B0X3VzZUNhcHR1cmUgfHwgZmFsc2UpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBub2RlLmRldGF0Y2hFdmVudCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5kZXRhdGNoRXZlbnQoJ29uJyArIGV2ZW50LCBmbik7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byByZWN0IG9iamVjdHMuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdDEgVGhlIGZpcnN0IHJlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdDIgVGhlIHNlY29uZCByZWN0LlxuICogQHJldHVybiB7P09iamVjdH0gVGhlIGludGVyc2VjdGlvbiByZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBpbnRlcnNlY3Rpb25cbiAqICAgICBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVJlY3RJbnRlcnNlY3Rpb24ocmVjdDEsIHJlY3QyKSB7XG4gIHZhciB0b3AgPSBNYXRoLm1heChyZWN0MS50b3AsIHJlY3QyLnRvcCk7XG4gIHZhciBib3R0b20gPSBNYXRoLm1pbihyZWN0MS5ib3R0b20sIHJlY3QyLmJvdHRvbSk7XG4gIHZhciBsZWZ0ID0gTWF0aC5tYXgocmVjdDEubGVmdCwgcmVjdDIubGVmdCk7XG4gIHZhciByaWdodCA9IE1hdGgubWluKHJlY3QxLnJpZ2h0LCByZWN0Mi5yaWdodCk7XG4gIHZhciB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgdmFyIGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcblxuICByZXR1cm4gKHdpZHRoID49IDAgJiYgaGVpZ2h0ID49IDApICYmIHtcbiAgICB0b3A6IHRvcCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cblxuXG4vKipcbiAqIFNoaW1zIHRoZSBuYXRpdmUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgSUUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nIHJlY3QgdG8gZ2V0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgKHBvc3NpYmx5IHNoaW1tZWQpIHJlY3Qgb2YgdGhlIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCkge1xuICB2YXIgcmVjdDtcblxuICB0cnkge1xuICAgIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWdub3JlIFdpbmRvd3MgNyBJRTExIFwiVW5zcGVjaWZpZWQgZXJyb3JcIlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvcHVsbC8yMDVcbiAgfVxuXG4gIGlmICghcmVjdCkgcmV0dXJuIGdldEVtcHR5UmVjdCgpO1xuXG4gIC8vIE9sZGVyIElFXG4gIGlmICghKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpKSB7XG4gICAgcmVjdCA9IHtcbiAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICB3aWR0aDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlY3Q7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IHJlY3Qgb2JqZWN0LiBBbiBlbXB0eSByZWN0IGlzIHJldHVybmVkIHdoZW4gYW4gZWxlbWVudFxuICogaXMgbm90IGluIHRoZSBET00uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbXB0eSByZWN0LlxuICovXG5mdW5jdGlvbiBnZXRFbXB0eVJlY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaWYgYSBwYXJlbnQgZWxlbWVudCBjb250YWlucyBhIGNoaWxkIGVsZW1lbnQgKGluY2x1ZGluZyBpbnNpZGVcbiAqIHNoYWRvdyBET00pLlxuICogQHBhcmFtIHtOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHBhcmFtIHtOb2RlfSBjaGlsZCBUaGUgY2hpbGQgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhcmVudCBub2RlIGNvbnRhaW5zIHRoZSBjaGlsZCBub2RlLlxuICovXG5mdW5jdGlvbiBjb250YWluc0RlZXAocGFyZW50LCBjaGlsZCkge1xuICB2YXIgbm9kZSA9IGNoaWxkO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09IHBhcmVudCkgcmV0dXJuIHRydWU7XG5cbiAgICBub2RlID0gZ2V0UGFyZW50Tm9kZShub2RlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgbm9kZSBvZiBhbiBlbGVtZW50IG9yIGl0cyBob3N0IGVsZW1lbnQgaWYgdGhlIHBhcmVudCBub2RlXG4gKiBpcyBhIHNoYWRvdyByb290LlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBub2RlIHdob3NlIHBhcmVudCB0byBnZXQuXG4gKiBAcmV0dXJuIHtOb2RlfG51bGx9IFRoZSBwYXJlbnQgbm9kZSBvciBudWxsIGlmIG5vIHBhcmVudCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUobm9kZSkge1xuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09IDExICYmIHBhcmVudC5ob3N0KSB7XG4gICAgLy8gSWYgdGhlIHBhcmVudCBpcyBhIHNoYWRvdyByb290LCByZXR1cm4gdGhlIGhvc3QgZWxlbWVudC5cbiAgICByZXR1cm4gcGFyZW50Lmhvc3Q7XG4gIH1cbiAgcmV0dXJuIHBhcmVudDtcbn1cblxuXG4vLyBFeHBvc2VzIHRoZSBjb25zdHJ1Y3RvcnMgZ2xvYmFsbHkuXG53aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcbndpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5ID0gSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeTtcblxufSh3aW5kb3csIGRvY3VtZW50KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/intersection-observer/intersection-observer.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/isbot/index.js":
+/*!*************************************!*\
+ !*** ./node_modules/isbot/index.js ***!
+ \*************************************/
+/***/ ((module) => {
+
+eval("function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : String(i);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nfunction _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _classPrivateFieldGet(receiver, privateMap) {\n var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\");\n return _classApplyDescriptorGet(receiver, descriptor);\n}\nfunction _classPrivateFieldSet(receiver, privateMap, value) {\n var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\");\n _classApplyDescriptorSet(receiver, descriptor, value);\n return value;\n}\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to \" + action + \" private field on non-instance\");\n }\n return privateMap.get(receiver);\n}\nfunction _classApplyDescriptorGet(receiver, descriptor) {\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n return descriptor.value;\n}\nfunction _classApplyDescriptorSet(receiver, descriptor, value) {\n if (descriptor.set) {\n descriptor.set.call(receiver, value);\n } else {\n if (!descriptor.writable) {\n throw new TypeError(\"attempted to set read only private field\");\n }\n descriptor.value = value;\n }\n}\nfunction _classPrivateMethodGet(receiver, privateSet, fn) {\n if (!privateSet.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return fn;\n}\nfunction _checkPrivateRedeclaration(obj, privateCollection) {\n if (privateCollection.has(obj)) {\n throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n }\n}\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) {\n _checkPrivateRedeclaration(obj, privateMap);\n privateMap.set(obj, value);\n}\nfunction _classPrivateMethodInitSpec(obj, privateSet) {\n _checkPrivateRedeclaration(obj, privateSet);\n privateSet.add(obj);\n}\n\nvar list = [\n\t\" daum[ /]\",\n\t\" deusu/\",\n\t\" yadirectfetcher\",\n\t\"(?:^| )site\",\n\t\"(?:^|[^g])news\",\n\t\"@[a-z]\",\n\t\"\\\\(at\\\\)[a-z]\",\n\t\"\\\\(github\\\\.com/\",\n\t\"\\\\[at\\\\][a-z]\",\n\t\"^12345\",\n\t\"^<\",\n\t\"^[\\\\w \\\\.\\\\-\\\\(\\\\)]+(/v?\\\\d+(\\\\.\\\\d+)?(\\\\.\\\\d{1,10})?)?$\",\n\t\"^[^ ]{50,}$\",\n\t\"^active\",\n\t\"^ad muncher\",\n\t\"^amaya\",\n\t\"^anglesharp/\",\n\t\"^anonymous\",\n\t\"^avsdevicesdk/\",\n\t\"^axios/\",\n\t\"^bidtellect/\",\n\t\"^biglotron\",\n\t\"^btwebclient/\",\n\t\"^castro\",\n\t\"^clamav[ /]\",\n\t\"^client/\",\n\t\"^cobweb/\",\n\t\"^coccoc\",\n\t\"^custom\",\n\t\"^ddg[_-]android\",\n\t\"^discourse\",\n\t\"^dispatch/\\\\d\",\n\t\"^downcast/\",\n\t\"^duckduckgo\",\n\t\"^facebook\",\n\t\"^fdm[ /]\\\\d\",\n\t\"^getright/\",\n\t\"^gozilla/\",\n\t\"^hatena\",\n\t\"^hobbit\",\n\t\"^hotzonu\",\n\t\"^hwcdn/\",\n\t\"^jeode/\",\n\t\"^jetty/\",\n\t\"^jigsaw\",\n\t\"^linkdex\",\n\t\"^lwp[-: ]\",\n\t\"^metauri\",\n\t\"^microsoft bits\",\n\t\"^movabletype\",\n\t\"^mozilla/\\\\d\\\\.\\\\d \\\\(compatible;?\\\\)$\",\n\t\"^mozilla/\\\\d\\\\.\\\\d \\\\w*$\",\n\t\"^navermailapp\",\n\t\"^netsurf\",\n\t\"^offline explorer\",\n\t\"^php\",\n\t\"^postman\",\n\t\"^postrank\",\n\t\"^python\",\n\t\"^read\",\n\t\"^reed\",\n\t\"^restsharp/\",\n\t\"^snapchat\",\n\t\"^space bison\",\n\t\"^svn\",\n\t\"^swcd \",\n\t\"^taringa\",\n\t\"^test certificate info\",\n\t\"^thumbor/\",\n\t\"^tumblr/\",\n\t\"^user-agent:mozilla\",\n\t\"^valid\",\n\t\"^venus/fedoraplanet\",\n\t\"^w3c\",\n\t\"^webbandit/\",\n\t\"^webcopier\",\n\t\"^wget\",\n\t\"^whatsapp\",\n\t\"^xenu link sleuth\",\n\t\"^yahoo\",\n\t\"^yandex\",\n\t\"^zdm/\\\\d\",\n\t\"^zoom marketplace/\",\n\t\"^{{.*}}$\",\n\t\"adbeat\\\\.com\",\n\t\"appinsights\",\n\t\"archive\",\n\t\"ask jeeves/teoma\",\n\t\"bit\\\\.ly/\",\n\t\"bluecoat drtr\",\n\t\"bot\",\n\t\"browsex\",\n\t\"burpcollaborator\",\n\t\"capture\",\n\t\"catch\",\n\t\"check\",\n\t\"chrome-lighthouse\",\n\t\"chromeframe\",\n\t\"cloud\",\n\t\"crawl\",\n\t\"cryptoapi\",\n\t\"dareboost\",\n\t\"datanyze\",\n\t\"dataprovider\",\n\t\"dejaclick\",\n\t\"dmbrowser\",\n\t\"download\",\n\t\"evc-batch/\",\n\t\"feed\",\n\t\"firephp\",\n\t\"freesafeip\",\n\t\"gomezagent\",\n\t\"google\",\n\t\"headlesschrome/\",\n\t\"http\",\n\t\"httrack\",\n\t\"hubspot marketing grader\",\n\t\"hydra\",\n\t\"ibisbrowser\",\n\t\"images\",\n\t\"inspect\",\n\t\"iplabel\",\n\t\"ips-agent\",\n\t\"java\",\n\t\"library\",\n\t\"mail\\\\.ru/\",\n\t\"manager\",\n\t\"monitor\",\n\t\"morningscore/\",\n\t\"neustar wpm\",\n\t\"nutch\",\n\t\"offbyone\",\n\t\"optimize\",\n\t\"pageburst\",\n\t\"pagespeed\",\n\t\"perl\",\n\t\"phantom\",\n\t\"pingdom\",\n\t\"powermarks\",\n\t\"preview\",\n\t\"proxy\",\n\t\"ptst[ /]\\\\d\",\n\t\"reader\",\n\t\"rexx;\",\n\t\"rigor\",\n\t\"rss\",\n\t\"scan\",\n\t\"scrape\",\n\t\"search\",\n\t\"serp ?reputation ?management\",\n\t\"server\",\n\t\"sogou\",\n\t\"sparkler/\",\n\t\"speedcurve\",\n\t\"spider\",\n\t\"splash\",\n\t\"statuscake\",\n\t\"stumbleupon\\\\.com\",\n\t\"supercleaner\",\n\t\"synapse\",\n\t\"synthetic\",\n\t\"torrent\",\n\t\"tracemyfile\",\n\t\"transcoder\",\n\t\"trendsmapresolver\",\n\t\"twingly recon\",\n\t\"url\",\n\t\"virtuoso\",\n\t\"wappalyzer\",\n\t\"webglance\",\n\t\"webkit2png\",\n\t\"websitemetadataretriever\",\n\t\"whatcms/\",\n\t\"wordpress\",\n\t\"zgrab\"\n];\n\n/**\n * Mutate given list of patter strings\n * @param {string[]} list\n * @returns {string[]}\n */\nfunction amend(list) {\n try {\n // Risk: Uses lookbehind assertion, avoid breakage in parsing by using RegExp constructor\n new RegExp('(?<! cu)bot').test('dangerbot'); // eslint-disable-line prefer-regex-literals\n } catch (error) {\n // Skip regex fixes\n return list;\n }\n [\n // Addresses: Cubot device\n ['bot', '(?<! cu)bot'],\n // Addresses: Android webview\n ['google', '(?<! (?:channel/|google/))google(?!(app|/google| pixel))'],\n // Addresses: libhttp browser\n ['http', '(?<!(?:lib))http'],\n // Addresses: java based browsers\n ['java', 'java(?!;)'],\n // Addresses: Yandex Search App\n ['search', '(?<! ya(?:yandex)?)search']].forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n search = _ref2[0],\n replace = _ref2[1];\n var index = list.lastIndexOf(search);\n if (~index) {\n list.splice(index, 1, replace);\n }\n });\n return list;\n}\n\namend(list);\nvar flags = 'i';\n\n/**\n * Test user agents for matching patterns\n */\nvar _list = /*#__PURE__*/new WeakMap();\nvar _pattern = /*#__PURE__*/new WeakMap();\nvar _update = /*#__PURE__*/new WeakSet();\nvar _index = /*#__PURE__*/new WeakSet();\nvar Isbot = /*#__PURE__*/function () {\n function Isbot(patterns) {\n var _this = this;\n _classCallCheck(this, Isbot);\n /**\n * Find the first index of an existing rule or -1 if not found\n * @param {string} rule\n * @returns {number}\n */\n _classPrivateMethodInitSpec(this, _index);\n /**\n * Recreate the pattern from rules list\n */\n _classPrivateMethodInitSpec(this, _update);\n /**\n * @type {string[]}\n */\n _classPrivateFieldInitSpec(this, _list, {\n writable: true,\n value: void 0\n });\n /**\n * @type {RegExp}\n */\n _classPrivateFieldInitSpec(this, _pattern, {\n writable: true,\n value: void 0\n });\n _classPrivateFieldSet(this, _list, patterns || list.slice());\n _classPrivateMethodGet(this, _update, _update2).call(this);\n var isbot = function isbot(ua) {\n return _this.test(ua);\n };\n return Object.defineProperties(isbot, Object.entries(Object.getOwnPropertyDescriptors(Isbot.prototype)).reduce(function (accumulator, _ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n prop = _ref2[0],\n descriptor = _ref2[1];\n if (typeof descriptor.value === 'function') {\n Object.assign(accumulator, _defineProperty({}, prop, {\n value: _this[prop].bind(_this)\n }));\n }\n if (typeof descriptor.get === 'function') {\n Object.assign(accumulator, _defineProperty({}, prop, {\n get: function get() {\n return _this[prop];\n }\n }));\n }\n return accumulator;\n }, {}));\n }\n _createClass(Isbot, [{\n key: \"pattern\",\n get:\n /**\n * Get a clone of the pattern\n * @type RegExp\n */\n function get() {\n return new RegExp(_classPrivateFieldGet(this, _pattern));\n }\n\n /**\n * Match given string against out pattern\n * @param {string} ua User Agent string\n * @returns {boolean}\n */\n }, {\n key: \"test\",\n value: function test(ua) {\n return Boolean(ua) && _classPrivateFieldGet(this, _pattern).test(ua);\n }\n }, {\n key: \"isbot\",\n value: function isbot(ua) {\n return Boolean(ua) && _classPrivateFieldGet(this, _pattern).test(ua);\n }\n\n /**\n * Get the match for strings' known crawler pattern\n * @param {string} ua User Agent string\n * @returns {string|null}\n */\n }, {\n key: \"find\",\n value: function find() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var match = ua.match(_classPrivateFieldGet(this, _pattern));\n return match && match[0];\n }\n\n /**\n * Get the patterns that match user agent string if any\n * @param {string} ua User Agent string\n * @returns {string[]}\n */\n }, {\n key: \"matches\",\n value: function matches() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return _classPrivateFieldGet(this, _list).filter(function (entry) {\n return new RegExp(entry, flags).test(ua);\n });\n }\n\n /**\n * Clear all patterns that match user agent\n * @param {string} ua User Agent string\n * @returns {void}\n */\n }, {\n key: \"clear\",\n value: function clear() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n this.exclude(this.matches(ua));\n }\n\n /**\n * Extent patterns for known crawlers\n * @param {string[]} filters\n * @returns {void}\n */\n }, {\n key: \"extend\",\n value: function extend() {\n var _this2 = this;\n var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n [].push.apply(_classPrivateFieldGet(this, _list), filters.filter(function (rule) {\n return _classPrivateMethodGet(_this2, _index, _index2).call(_this2, rule) === -1;\n }).map(function (filter) {\n return filter.toLowerCase();\n }));\n _classPrivateMethodGet(this, _update, _update2).call(this);\n }\n\n /**\n * Exclude patterns from bot pattern rule\n * @param {string[]} filters\n * @returns {void}\n */\n }, {\n key: \"exclude\",\n value: function exclude() {\n var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var length = filters.length;\n while (length--) {\n var index = _classPrivateMethodGet(this, _index, _index2).call(this, filters[length]);\n if (index > -1) {\n _classPrivateFieldGet(this, _list).splice(index, 1);\n }\n }\n _classPrivateMethodGet(this, _update, _update2).call(this);\n }\n\n /**\n * Create a new Isbot instance using given list or self's list\n * @param {string[]} [list]\n * @returns {Isbot}\n */\n }, {\n key: \"spawn\",\n value: function spawn(list) {\n return new Isbot(list || _classPrivateFieldGet(this, _list));\n }\n }]);\n return Isbot;\n}();\nfunction _update2() {\n _classPrivateFieldSet(this, _pattern, new RegExp(_classPrivateFieldGet(this, _list).join('|'), flags));\n}\nfunction _index2(rule) {\n return _classPrivateFieldGet(this, _list).indexOf(rule.toLowerCase());\n}\n\nvar isbot = new Isbot();\n\nmodule.exports = isbot;\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaXNib3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2lzYm90L2luZGV4LmpzP2U5YzgiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHQucmV0dXJuICYmICh1ID0gdC5yZXR1cm4oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG8pIHRocm93IG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG59XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogU3RyaW5nKGkpO1xufVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIFwiZ2V0XCIpO1xuICByZXR1cm4gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcInNldFwiKTtcbiAgX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yLCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIGFjdGlvbikge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gXCIgKyBhY3Rpb24gKyBcIiBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xufVxuZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7XG4gIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgfVxuICByZXR1cm4gZGVzY3JpcHRvci52YWx1ZTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpIHtcbiAgaWYgKGRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgZGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGlmICghZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcmVhZCBvbmx5IHByaXZhdGUgZmllbGRcIik7XG4gICAgfVxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChyZWNlaXZlciwgcHJpdmF0ZVNldCwgZm4pIHtcbiAgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuICByZXR1cm4gZm47XG59XG5mdW5jdGlvbiBfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVDb2xsZWN0aW9uKSB7XG4gIGlmIChwcml2YXRlQ29sbGVjdGlvbi5oYXMob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdFwiKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMob2JqLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVNYXApO1xuICBwcml2YXRlTWFwLnNldChvYmosIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyhvYmosIHByaXZhdGVTZXQpIHtcbiAgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlU2V0KTtcbiAgcHJpdmF0ZVNldC5hZGQob2JqKTtcbn1cblxudmFyIGxpc3QgPSBbXG5cdFwiIGRhdW1bIC9dXCIsXG5cdFwiIGRldXN1L1wiLFxuXHRcIiB5YWRpcmVjdGZldGNoZXJcIixcblx0XCIoPzpefCApc2l0ZVwiLFxuXHRcIig/Ol58W15nXSluZXdzXCIsXG5cdFwiQFthLXpdXCIsXG5cdFwiXFxcXChhdFxcXFwpW2Etel1cIixcblx0XCJcXFxcKGdpdGh1YlxcXFwuY29tL1wiLFxuXHRcIlxcXFxbYXRcXFxcXVthLXpdXCIsXG5cdFwiXjEyMzQ1XCIsXG5cdFwiXjxcIixcblx0XCJeW1xcXFx3IFxcXFwuXFxcXC1cXFxcKFxcXFwpXSsoL3Y/XFxcXGQrKFxcXFwuXFxcXGQrKT8oXFxcXC5cXFxcZHsxLDEwfSk/KT8kXCIsXG5cdFwiXlteIF17NTAsfSRcIixcblx0XCJeYWN0aXZlXCIsXG5cdFwiXmFkIG11bmNoZXJcIixcblx0XCJeYW1heWFcIixcblx0XCJeYW5nbGVzaGFycC9cIixcblx0XCJeYW5vbnltb3VzXCIsXG5cdFwiXmF2c2RldmljZXNkay9cIixcblx0XCJeYXhpb3MvXCIsXG5cdFwiXmJpZHRlbGxlY3QvXCIsXG5cdFwiXmJpZ2xvdHJvblwiLFxuXHRcIl5idHdlYmNsaWVudC9cIixcblx0XCJeY2FzdHJvXCIsXG5cdFwiXmNsYW1hdlsgL11cIixcblx0XCJeY2xpZW50L1wiLFxuXHRcIl5jb2J3ZWIvXCIsXG5cdFwiXmNvY2NvY1wiLFxuXHRcIl5jdXN0b21cIixcblx0XCJeZGRnW18tXWFuZHJvaWRcIixcblx0XCJeZGlzY291cnNlXCIsXG5cdFwiXmRpc3BhdGNoL1xcXFxkXCIsXG5cdFwiXmRvd25jYXN0L1wiLFxuXHRcIl5kdWNrZHVja2dvXCIsXG5cdFwiXmZhY2Vib29rXCIsXG5cdFwiXmZkbVsgL11cXFxcZFwiLFxuXHRcIl5nZXRyaWdodC9cIixcblx0XCJeZ296aWxsYS9cIixcblx0XCJeaGF0ZW5hXCIsXG5cdFwiXmhvYmJpdFwiLFxuXHRcIl5ob3R6b251XCIsXG5cdFwiXmh3Y2RuL1wiLFxuXHRcIl5qZW9kZS9cIixcblx0XCJeamV0dHkvXCIsXG5cdFwiXmppZ3Nhd1wiLFxuXHRcIl5saW5rZGV4XCIsXG5cdFwiXmx3cFstOiBdXCIsXG5cdFwiXm1ldGF1cmlcIixcblx0XCJebWljcm9zb2Z0IGJpdHNcIixcblx0XCJebW92YWJsZXR5cGVcIixcblx0XCJebW96aWxsYS9cXFxcZFxcXFwuXFxcXGQgXFxcXChjb21wYXRpYmxlOz9cXFxcKSRcIixcblx0XCJebW96aWxsYS9cXFxcZFxcXFwuXFxcXGQgXFxcXHcqJFwiLFxuXHRcIl5uYXZlcm1haWxhcHBcIixcblx0XCJebmV0c3VyZlwiLFxuXHRcIl5vZmZsaW5lIGV4cGxvcmVyXCIsXG5cdFwiXnBocFwiLFxuXHRcIl5wb3N0bWFuXCIsXG5cdFwiXnBvc3RyYW5rXCIsXG5cdFwiXnB5dGhvblwiLFxuXHRcIl5yZWFkXCIsXG5cdFwiXnJlZWRcIixcblx0XCJecmVzdHNoYXJwL1wiLFxuXHRcIl5zbmFwY2hhdFwiLFxuXHRcIl5zcGFjZSBiaXNvblwiLFxuXHRcIl5zdm5cIixcblx0XCJec3djZCBcIixcblx0XCJedGFyaW5nYVwiLFxuXHRcIl50ZXN0IGNlcnRpZmljYXRlIGluZm9cIixcblx0XCJedGh1bWJvci9cIixcblx0XCJedHVtYmxyL1wiLFxuXHRcIl51c2VyLWFnZW50Om1vemlsbGFcIixcblx0XCJedmFsaWRcIixcblx0XCJedmVudXMvZmVkb3JhcGxhbmV0XCIsXG5cdFwiXnczY1wiLFxuXHRcIl53ZWJiYW5kaXQvXCIsXG5cdFwiXndlYmNvcGllclwiLFxuXHRcIl53Z2V0XCIsXG5cdFwiXndoYXRzYXBwXCIsXG5cdFwiXnhlbnUgbGluayBzbGV1dGhcIixcblx0XCJeeWFob29cIixcblx0XCJeeWFuZGV4XCIsXG5cdFwiXnpkbS9cXFxcZFwiLFxuXHRcIl56b29tIG1hcmtldHBsYWNlL1wiLFxuXHRcIl57ey4qfX0kXCIsXG5cdFwiYWRiZWF0XFxcXC5jb21cIixcblx0XCJhcHBpbnNpZ2h0c1wiLFxuXHRcImFyY2hpdmVcIixcblx0XCJhc2sgamVldmVzL3Rlb21hXCIsXG5cdFwiYml0XFxcXC5seS9cIixcblx0XCJibHVlY29hdCBkcnRyXCIsXG5cdFwiYm90XCIsXG5cdFwiYnJvd3NleFwiLFxuXHRcImJ1cnBjb2xsYWJvcmF0b3JcIixcblx0XCJjYXB0dXJlXCIsXG5cdFwiY2F0Y2hcIixcblx0XCJjaGVja1wiLFxuXHRcImNocm9tZS1saWdodGhvdXNlXCIsXG5cdFwiY2hyb21lZnJhbWVcIixcblx0XCJjbG91ZFwiLFxuXHRcImNyYXdsXCIsXG5cdFwiY3J5cHRvYXBpXCIsXG5cdFwiZGFyZWJvb3N0XCIsXG5cdFwiZGF0YW55emVcIixcblx0XCJkYXRhcHJvdmlkZXJcIixcblx0XCJkZWphY2xpY2tcIixcblx0XCJkbWJyb3dzZXJcIixcblx0XCJkb3dubG9hZFwiLFxuXHRcImV2Yy1iYXRjaC9cIixcblx0XCJmZWVkXCIsXG5cdFwiZmlyZXBocFwiLFxuXHRcImZyZWVzYWZlaXBcIixcblx0XCJnb21lemFnZW50XCIsXG5cdFwiZ29vZ2xlXCIsXG5cdFwiaGVhZGxlc3NjaHJvbWUvXCIsXG5cdFwiaHR0cFwiLFxuXHRcImh0dHJhY2tcIixcblx0XCJodWJzcG90IG1hcmtldGluZyBncmFkZXJcIixcblx0XCJoeWRyYVwiLFxuXHRcImliaXNicm93c2VyXCIsXG5cdFwiaW1hZ2VzXCIsXG5cdFwiaW5zcGVjdFwiLFxuXHRcImlwbGFiZWxcIixcblx0XCJpcHMtYWdlbnRcIixcblx0XCJqYXZhXCIsXG5cdFwibGlicmFyeVwiLFxuXHRcIm1haWxcXFxcLnJ1L1wiLFxuXHRcIm1hbmFnZXJcIixcblx0XCJtb25pdG9yXCIsXG5cdFwibW9ybmluZ3Njb3JlL1wiLFxuXHRcIm5ldXN0YXIgd3BtXCIsXG5cdFwibnV0Y2hcIixcblx0XCJvZmZieW9uZVwiLFxuXHRcIm9wdGltaXplXCIsXG5cdFwicGFnZWJ1cnN0XCIsXG5cdFwicGFnZXNwZWVkXCIsXG5cdFwicGVybFwiLFxuXHRcInBoYW50b21cIixcblx0XCJwaW5nZG9tXCIsXG5cdFwicG93ZXJtYXJrc1wiLFxuXHRcInByZXZpZXdcIixcblx0XCJwcm94eVwiLFxuXHRcInB0c3RbIC9dXFxcXGRcIixcblx0XCJyZWFkZXJcIixcblx0XCJyZXh4O1wiLFxuXHRcInJpZ29yXCIsXG5cdFwicnNzXCIsXG5cdFwic2NhblwiLFxuXHRcInNjcmFwZVwiLFxuXHRcInNlYXJjaFwiLFxuXHRcInNlcnAgP3JlcHV0YXRpb24gP21hbmFnZW1lbnRcIixcblx0XCJzZXJ2ZXJcIixcblx0XCJzb2dvdVwiLFxuXHRcInNwYXJrbGVyL1wiLFxuXHRcInNwZWVkY3VydmVcIixcblx0XCJzcGlkZXJcIixcblx0XCJzcGxhc2hcIixcblx0XCJzdGF0dXNjYWtlXCIsXG5cdFwic3R1bWJsZXVwb25cXFxcLmNvbVwiLFxuXHRcInN1cGVyY2xlYW5lclwiLFxuXHRcInN5bmFwc2VcIixcblx0XCJzeW50aGV0aWNcIixcblx0XCJ0b3JyZW50XCIsXG5cdFwidHJhY2VteWZpbGVcIixcblx0XCJ0cmFuc2NvZGVyXCIsXG5cdFwidHJlbmRzbWFwcmVzb2x2ZXJcIixcblx0XCJ0d2luZ2x5IHJlY29uXCIsXG5cdFwidXJsXCIsXG5cdFwidmlydHVvc29cIixcblx0XCJ3YXBwYWx5emVyXCIsXG5cdFwid2ViZ2xhbmNlXCIsXG5cdFwid2Via2l0MnBuZ1wiLFxuXHRcIndlYnNpdGVtZXRhZGF0YXJldHJpZXZlclwiLFxuXHRcIndoYXRjbXMvXCIsXG5cdFwid29yZHByZXNzXCIsXG5cdFwiemdyYWJcIlxuXTtcblxuLyoqXG4gKiBNdXRhdGUgZ2l2ZW4gbGlzdCBvZiBwYXR0ZXIgc3RyaW5nc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gbGlzdFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5mdW5jdGlvbiBhbWVuZChsaXN0KSB7XG4gIHRyeSB7XG4gICAgLy8gUmlzazogVXNlcyBsb29rYmVoaW5kIGFzc2VydGlvbiwgYXZvaWQgYnJlYWthZ2UgaW4gcGFyc2luZyBieSB1c2luZyBSZWdFeHAgY29uc3RydWN0b3JcbiAgICBuZXcgUmVnRXhwKCcoPzwhIGN1KWJvdCcpLnRlc3QoJ2RhbmdlcmJvdCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZWdleC1saXRlcmFsc1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFNraXAgcmVnZXggZml4ZXNcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuICBbXG4gIC8vIEFkZHJlc3NlczogQ3Vib3QgZGV2aWNlXG4gIFsnYm90JywgJyg/PCEgY3UpYm90J10sXG4gIC8vIEFkZHJlc3NlczogQW5kcm9pZCB3ZWJ2aWV3XG4gIFsnZ29vZ2xlJywgJyg/PCEgKD86Y2hhbm5lbC98Z29vZ2xlLykpZ29vZ2xlKD8hKGFwcHwvZ29vZ2xlfCBwaXhlbCkpJ10sXG4gIC8vIEFkZHJlc3NlczogbGliaHR0cCBicm93c2VyXG4gIFsnaHR0cCcsICcoPzwhKD86bGliKSlodHRwJ10sXG4gIC8vIEFkZHJlc3NlczogamF2YSBiYXNlZCBicm93c2Vyc1xuICBbJ2phdmEnLCAnamF2YSg/ITspJ10sXG4gIC8vIEFkZHJlc3NlczogWWFuZGV4IFNlYXJjaCBBcHBcbiAgWydzZWFyY2gnLCAnKD88ISB5YSg/OnlhbmRleCk/KXNlYXJjaCddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICBzZWFyY2ggPSBfcmVmMlswXSxcbiAgICAgIHJlcGxhY2UgPSBfcmVmMlsxXTtcbiAgICB2YXIgaW5kZXggPSBsaXN0Lmxhc3RJbmRleE9mKHNlYXJjaCk7XG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEsIHJlcGxhY2UpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaXN0O1xufVxuXG5hbWVuZChsaXN0KTtcbnZhciBmbGFncyA9ICdpJztcblxuLyoqXG4gKiBUZXN0IHVzZXIgYWdlbnRzIGZvciBtYXRjaGluZyBwYXR0ZXJuc1xuICovXG52YXIgX2xpc3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbnZhciBfcGF0dGVybiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xudmFyIF91cGRhdGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbnZhciBfaW5kZXggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbnZhciBJc2JvdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElzYm90KHBhdHRlcm5zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSXNib3QpO1xuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGZpcnN0IGluZGV4IG9mIGFuIGV4aXN0aW5nIHJ1bGUgb3IgLTEgaWYgbm90IGZvdW5kXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBydWxlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2luZGV4KTtcbiAgICAvKipcbiAgICAgKiBSZWNyZWF0ZSB0aGUgcGF0dGVybiBmcm9tIHJ1bGVzIGxpc3RcbiAgICAgKi9cbiAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3VwZGF0ZSk7XG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9saXN0LCB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAqL1xuICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wYXR0ZXJuLCB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KTtcbiAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2xpc3QsIHBhdHRlcm5zIHx8IGxpc3Quc2xpY2UoKSk7XG4gICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdXBkYXRlLCBfdXBkYXRlMikuY2FsbCh0aGlzKTtcbiAgICB2YXIgaXNib3QgPSBmdW5jdGlvbiBpc2JvdCh1YSkge1xuICAgICAgcmV0dXJuIF90aGlzLnRlc3QodWEpO1xuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlzYm90LCBPYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhJc2JvdC5wcm90b3R5cGUpKS5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtdWxhdG9yLCBfcmVmKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgcHJvcCA9IF9yZWYyWzBdLFxuICAgICAgICBkZXNjcmlwdG9yID0gX3JlZjJbMV07XG4gICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2N1bXVsYXRvciwgX2RlZmluZVByb3BlcnR5KHt9LCBwcm9wLCB7XG4gICAgICAgICAgdmFsdWU6IF90aGlzW3Byb3BdLmJpbmQoX3RoaXMpXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2N1bXVsYXRvciwgX2RlZmluZVByb3BlcnR5KHt9LCBwcm9wLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwge30pKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoSXNib3QsIFt7XG4gICAga2V5OiBcInBhdHRlcm5cIixcbiAgICBnZXQ6XG4gICAgLyoqXG4gICAgICogR2V0IGEgY2xvbmUgb2YgdGhlIHBhdHRlcm5cbiAgICAgKiBAdHlwZSBSZWdFeHBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BhdHRlcm4pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBnaXZlbiBzdHJpbmcgYWdhaW5zdCBvdXQgcGF0dGVyblxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdWEgVXNlciBBZ2VudCBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJ0ZXN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRlc3QodWEpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHVhKSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BhdHRlcm4pLnRlc3QodWEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc2JvdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc2JvdCh1YSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odWEpICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGF0dGVybikudGVzdCh1YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXRjaCBmb3Igc3RyaW5ncycga25vd24gY3Jhd2xlciBwYXR0ZXJuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB1YSBVc2VyIEFnZW50IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJmaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoKSB7XG4gICAgICB2YXIgdWEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgICAgdmFyIG1hdGNoID0gdWEubWF0Y2goX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wYXR0ZXJuKSk7XG4gICAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwYXR0ZXJucyB0aGF0IG1hdGNoIHVzZXIgYWdlbnQgc3RyaW5nIGlmIGFueVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdWEgVXNlciBBZ2VudCBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwibWF0Y2hlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaGVzKCkge1xuICAgICAgdmFyIHVhID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoZW50cnksIGZsYWdzKS50ZXN0KHVhKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwYXR0ZXJucyB0aGF0IG1hdGNoIHVzZXIgYWdlbnRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHVhIFVzZXIgQWdlbnQgc3RyaW5nXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB2YXIgdWEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgICAgdGhpcy5leGNsdWRlKHRoaXMubWF0Y2hlcyh1YSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dGVudCBwYXR0ZXJucyBmb3Iga25vd24gY3Jhd2xlcnNcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmdbXX0gZmlsdGVyc1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImV4dGVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBmaWx0ZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICAgIFtdLnB1c2guYXBwbHkoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9saXN0KSwgZmlsdGVycy5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQoX3RoaXMyLCBfaW5kZXgsIF9pbmRleDIpLmNhbGwoX3RoaXMyLCBydWxlKSA9PT0gLTE7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZmlsdGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9KSk7XG4gICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF91cGRhdGUsIF91cGRhdGUyKS5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2x1ZGUgcGF0dGVybnMgZnJvbSBib3QgcGF0dGVybiBydWxlXG4gICAgICogQHBhcmFtICB7c3RyaW5nW119IGZpbHRlcnNcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJleGNsdWRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4Y2x1ZGUoKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgICB2YXIgbGVuZ3RoID0gZmlsdGVycy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaW5kZXgsIF9pbmRleDIpLmNhbGwodGhpcywgZmlsdGVyc1tsZW5ndGhdKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3VwZGF0ZSwgX3VwZGF0ZTIpLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IElzYm90IGluc3RhbmNlIHVzaW5nIGdpdmVuIGxpc3Qgb3Igc2VsZidzIGxpc3RcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmdbXX0gW2xpc3RdXG4gICAgICogQHJldHVybnMge0lzYm90fVxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcInNwYXduXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNwYXduKGxpc3QpIHtcbiAgICAgIHJldHVybiBuZXcgSXNib3QobGlzdCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIElzYm90O1xufSgpO1xuZnVuY3Rpb24gX3VwZGF0ZTIoKSB7XG4gIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfcGF0dGVybiwgbmV3IFJlZ0V4cChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpLmpvaW4oJ3wnKSwgZmxhZ3MpKTtcbn1cbmZ1bmN0aW9uIF9pbmRleDIocnVsZSkge1xuICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9saXN0KS5pbmRleE9mKHJ1bGUudG9Mb3dlckNhc2UoKSk7XG59XG5cbnZhciBpc2JvdCA9IG5ldyBJc2JvdCgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzYm90O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/isbot/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/masonry-layout/masonry.js":
+/*!************************************************!*\
+ !*** ./node_modules/masonry-layout/masonry.js ***!
+ \************************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Masonry v4.2.2\n * Cascading grid layout library\n * https://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! outlayer/outlayer */ \"./node_modules/outlayer/outlayer.js\"),\n __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\")\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( Outlayer, getSize ) {\n\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Masonry = Outlayer.create('masonry');\n // isFitWidth -> fitWidth\n Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n var proto = Masonry.prototype;\n\n proto._resetLayout = function() {\n this.getSize();\n this._getMeasurement( 'columnWidth', 'outerWidth' );\n this._getMeasurement( 'gutter', 'outerWidth' );\n this.measureColumns();\n\n // reset column Y\n this.colYs = [];\n for ( var i=0; i < this.cols; i++ ) {\n this.colYs.push( 0 );\n }\n\n this.maxY = 0;\n this.horizontalColIndex = 0;\n };\n\n proto.measureColumns = function() {\n this.getContainerWidth();\n // if columnWidth is 0, default to outerWidth of first item\n if ( !this.columnWidth ) {\n var firstItem = this.items[0];\n var firstItemElem = firstItem && firstItem.element;\n // columnWidth fall back to item of first element\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n // if first elem has no width, default to size of container\n this.containerWidth;\n }\n\n var columnWidth = this.columnWidth += this.gutter;\n\n // calculate columns\n var containerWidth = this.containerWidth + this.gutter;\n var cols = containerWidth / columnWidth;\n // fix rounding errors, typically with gutters\n var excess = columnWidth - containerWidth % columnWidth;\n // if overshoot is less than a pixel, round up, otherwise floor it\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n cols = Math[ mathMethod ]( cols );\n this.cols = Math.max( cols, 1 );\n };\n\n proto.getContainerWidth = function() {\n // container is parent if fit width\n var isFitWidth = this._getOption('fitWidth');\n var container = isFitWidth ? this.element.parentNode : this.element;\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var size = getSize( container );\n this.containerWidth = size && size.innerWidth;\n };\n\n proto._getItemLayoutPosition = function( item ) {\n item.getSize();\n // how many columns does this brick span\n var remainder = item.size.outerWidth % this.columnWidth;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n // round if off by 1 pixel, otherwise use ceil\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n colSpan = Math.min( colSpan, this.cols );\n // use horizontal or top column position\n var colPosMethod = this.options.horizontalOrder ?\n '_getHorizontalColPosition' : '_getTopColPosition';\n var colPosition = this[ colPosMethod ]( colSpan, item );\n // position the brick\n var position = {\n x: this.columnWidth * colPosition.col,\n y: colPosition.y\n };\n // apply setHeight to necessary columns\n var setHeight = colPosition.y + item.size.outerHeight;\n var setMax = colSpan + colPosition.col;\n for ( var i = colPosition.col; i < setMax; i++ ) {\n this.colYs[i] = setHeight;\n }\n\n return position;\n };\n\n proto._getTopColPosition = function( colSpan ) {\n var colGroup = this._getTopColGroup( colSpan );\n // get the minimum Y value from the columns\n var minimumY = Math.min.apply( Math, colGroup );\n\n return {\n col: colGroup.indexOf( minimumY ),\n y: minimumY,\n };\n };\n\n /**\n * @param {Number} colSpan - number of columns the element spans\n * @returns {Array} colGroup\n */\n proto._getTopColGroup = function( colSpan ) {\n if ( colSpan < 2 ) {\n // if brick spans only one column, use all the column Ys\n return this.colYs;\n }\n\n var colGroup = [];\n // how many different places could this brick fit horizontally\n var groupCount = this.cols + 1 - colSpan;\n // for each group potential horizontal position\n for ( var i = 0; i < groupCount; i++ ) {\n colGroup[i] = this._getColGroupY( i, colSpan );\n }\n return colGroup;\n };\n\n proto._getColGroupY = function( col, colSpan ) {\n if ( colSpan < 2 ) {\n return this.colYs[ col ];\n }\n // make an array of colY values for that one group\n var groupColYs = this.colYs.slice( col, col + colSpan );\n // and get the max value of the array\n return Math.max.apply( Math, groupColYs );\n };\n\n // get column position based on horizontal index. #873\n proto._getHorizontalColPosition = function( colSpan, item ) {\n var col = this.horizontalColIndex % this.cols;\n var isOver = colSpan > 1 && col + colSpan > this.cols;\n // shift to next row if item can't fit on current row\n col = isOver ? 0 : col;\n // don't let zero-size items take up space\n var hasSize = item.size.outerWidth && item.size.outerHeight;\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n return {\n col: col,\n y: this._getColGroupY( col, colSpan ),\n };\n };\n\n proto._manageStamp = function( stamp ) {\n var stampSize = getSize( stamp );\n var offset = this._getElementOffset( stamp );\n // get the columns that this stamp affects\n var isOriginLeft = this._getOption('originLeft');\n var firstX = isOriginLeft ? offset.left : offset.right;\n var lastX = firstX + stampSize.outerWidth;\n var firstCol = Math.floor( firstX / this.columnWidth );\n firstCol = Math.max( 0, firstCol );\n var lastCol = Math.floor( lastX / this.columnWidth );\n // lastCol should not go over if multiple of columnWidth #425\n lastCol -= lastX % this.columnWidth ? 0 : 1;\n lastCol = Math.min( this.cols - 1, lastCol );\n // set colYs to bottom of the stamp\n\n var isOriginTop = this._getOption('originTop');\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n stampSize.outerHeight;\n for ( var i = firstCol; i <= lastCol; i++ ) {\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n }\n };\n\n proto._getContainerSize = function() {\n this.maxY = Math.max.apply( Math, this.colYs );\n var size = {\n height: this.maxY\n };\n\n if ( this._getOption('fitWidth') ) {\n size.width = this._getContainerFitWidth();\n }\n\n return size;\n };\n\n proto._getContainerFitWidth = function() {\n var unusedCols = 0;\n // count unused columns\n var i = this.cols;\n while ( --i ) {\n if ( this.colYs[i] !== 0 ) {\n break;\n }\n unusedCols++;\n }\n // fit container to columns that have been used\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n };\n\n proto.needsResizeLayout = function() {\n var previousWidth = this.containerWidth;\n this.getContainerWidth();\n return previousWidth != this.containerWidth;\n };\n\n return Masonry;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbWFzb25yeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbWFzb25yeS5qcz84NGQzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogTWFzb25yeSB2NC4yLjJcbiAqIENhc2NhZGluZyBncmlkIGxheW91dCBsaWJyYXJ5XG4gKiBodHRwczovL21hc29ucnkuZGVzYW5kcm8uY29tXG4gKiBNSVQgTGljZW5zZVxuICogYnkgRGF2aWQgRGVTYW5kcm9cbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ291dGxheWVyL291dGxheWVyJyxcbiAgICAgICAgJ2dldC1zaXplL2dldC1zaXplJ1xuICAgICAgXSxcbiAgICAgIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHJlcXVpcmUoJ291dGxheWVyJyksXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5NYXNvbnJ5ID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdy5PdXRsYXllcixcbiAgICAgIHdpbmRvdy5nZXRTaXplXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIE91dGxheWVyLCBnZXRTaXplICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1hc29ucnlEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLy8gY3JlYXRlIGFuIE91dGxheWVyIGxheW91dCBjbGFzc1xuICB2YXIgTWFzb25yeSA9IE91dGxheWVyLmNyZWF0ZSgnbWFzb25yeScpO1xuICAvLyBpc0ZpdFdpZHRoIC0+IGZpdFdpZHRoXG4gIE1hc29ucnkuY29tcGF0T3B0aW9ucy5maXRXaWR0aCA9ICdpc0ZpdFdpZHRoJztcblxuICB2YXIgcHJvdG8gPSBNYXNvbnJ5LnByb3RvdHlwZTtcblxuICBwcm90by5fcmVzZXRMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmdldFNpemUoKTtcbiAgICB0aGlzLl9nZXRNZWFzdXJlbWVudCggJ2NvbHVtbldpZHRoJywgJ291dGVyV2lkdGgnICk7XG4gICAgdGhpcy5fZ2V0TWVhc3VyZW1lbnQoICdndXR0ZXInLCAnb3V0ZXJXaWR0aCcgKTtcbiAgICB0aGlzLm1lYXN1cmVDb2x1bW5zKCk7XG5cbiAgICAvLyByZXNldCBjb2x1bW4gWVxuICAgIHRoaXMuY29sWXMgPSBbXTtcbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5jb2xzOyBpKysgKSB7XG4gICAgICB0aGlzLmNvbFlzLnB1c2goIDAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm1heFkgPSAwO1xuICAgIHRoaXMuaG9yaXpvbnRhbENvbEluZGV4ID0gMDtcbiAgfTtcblxuICBwcm90by5tZWFzdXJlQ29sdW1ucyA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICAvLyBpZiBjb2x1bW5XaWR0aCBpcyAwLCBkZWZhdWx0IHRvIG91dGVyV2lkdGggb2YgZmlyc3QgaXRlbVxuICAgIGlmICggIXRoaXMuY29sdW1uV2lkdGggKSB7XG4gICAgICB2YXIgZmlyc3RJdGVtID0gdGhpcy5pdGVtc1swXTtcbiAgICAgIHZhciBmaXJzdEl0ZW1FbGVtID0gZmlyc3RJdGVtICYmIGZpcnN0SXRlbS5lbGVtZW50O1xuICAgICAgLy8gY29sdW1uV2lkdGggZmFsbCBiYWNrIHRvIGl0ZW0gb2YgZmlyc3QgZWxlbWVudFxuICAgICAgdGhpcy5jb2x1bW5XaWR0aCA9IGZpcnN0SXRlbUVsZW0gJiYgZ2V0U2l6ZSggZmlyc3RJdGVtRWxlbSApLm91dGVyV2lkdGggfHxcbiAgICAgICAgLy8gaWYgZmlyc3QgZWxlbSBoYXMgbm8gd2lkdGgsIGRlZmF1bHQgdG8gc2l6ZSBvZiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICB9XG5cbiAgICB2YXIgY29sdW1uV2lkdGggPSB0aGlzLmNvbHVtbldpZHRoICs9IHRoaXMuZ3V0dGVyO1xuXG4gICAgLy8gY2FsY3VsYXRlIGNvbHVtbnNcbiAgICB2YXIgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoICsgdGhpcy5ndXR0ZXI7XG4gICAgdmFyIGNvbHMgPSBjb250YWluZXJXaWR0aCAvIGNvbHVtbldpZHRoO1xuICAgIC8vIGZpeCByb3VuZGluZyBlcnJvcnMsIHR5cGljYWxseSB3aXRoIGd1dHRlcnNcbiAgICB2YXIgZXhjZXNzID0gY29sdW1uV2lkdGggLSBjb250YWluZXJXaWR0aCAlIGNvbHVtbldpZHRoO1xuICAgIC8vIGlmIG92ZXJzaG9vdCBpcyBsZXNzIHRoYW4gYSBwaXhlbCwgcm91bmQgdXAsIG90aGVyd2lzZSBmbG9vciBpdFxuICAgIHZhciBtYXRoTWV0aG9kID0gZXhjZXNzICYmIGV4Y2VzcyA8IDEgPyAncm91bmQnIDogJ2Zsb29yJztcbiAgICBjb2xzID0gTWF0aFsgbWF0aE1ldGhvZCBdKCBjb2xzICk7XG4gICAgdGhpcy5jb2xzID0gTWF0aC5tYXgoIGNvbHMsIDEgKTtcbiAgfTtcblxuICBwcm90by5nZXRDb250YWluZXJXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIGNvbnRhaW5lciBpcyBwYXJlbnQgaWYgZml0IHdpZHRoXG4gICAgdmFyIGlzRml0V2lkdGggPSB0aGlzLl9nZXRPcHRpb24oJ2ZpdFdpZHRoJyk7XG4gICAgdmFyIGNvbnRhaW5lciA9IGlzRml0V2lkdGggPyB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSA6IHRoaXMuZWxlbWVudDtcbiAgICAvLyBjaGVjayB0aGF0IHRoaXMuc2l6ZSBhbmQgc2l6ZSBhcmUgdGhlcmVcbiAgICAvLyBJRTggdHJpZ2dlcnMgcmVzaXplIG9uIGJvZHkgc2l6ZSBjaGFuZ2UsIHNvIHRoZXkgbWlnaHQgbm90IGJlXG4gICAgdmFyIHNpemUgPSBnZXRTaXplKCBjb250YWluZXIgKTtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gc2l6ZSAmJiBzaXplLmlubmVyV2lkdGg7XG4gIH07XG5cbiAgcHJvdG8uX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0uZ2V0U2l6ZSgpO1xuICAgIC8vIGhvdyBtYW55IGNvbHVtbnMgZG9lcyB0aGlzIGJyaWNrIHNwYW5cbiAgICB2YXIgcmVtYWluZGVyID0gaXRlbS5zaXplLm91dGVyV2lkdGggJSB0aGlzLmNvbHVtbldpZHRoO1xuICAgIHZhciBtYXRoTWV0aG9kID0gcmVtYWluZGVyICYmIHJlbWFpbmRlciA8IDEgPyAncm91bmQnIDogJ2NlaWwnO1xuICAgIC8vIHJvdW5kIGlmIG9mZiBieSAxIHBpeGVsLCBvdGhlcndpc2UgdXNlIGNlaWxcbiAgICB2YXIgY29sU3BhbiA9IE1hdGhbIG1hdGhNZXRob2QgXSggaXRlbS5zaXplLm91dGVyV2lkdGggLyB0aGlzLmNvbHVtbldpZHRoICk7XG4gICAgY29sU3BhbiA9IE1hdGgubWluKCBjb2xTcGFuLCB0aGlzLmNvbHMgKTtcbiAgICAvLyB1c2UgaG9yaXpvbnRhbCBvciB0b3AgY29sdW1uIHBvc2l0aW9uXG4gICAgdmFyIGNvbFBvc01ldGhvZCA9IHRoaXMub3B0aW9ucy5ob3Jpem9udGFsT3JkZXIgP1xuICAgICAgJ19nZXRIb3Jpem9udGFsQ29sUG9zaXRpb24nIDogJ19nZXRUb3BDb2xQb3NpdGlvbic7XG4gICAgdmFyIGNvbFBvc2l0aW9uID0gdGhpc1sgY29sUG9zTWV0aG9kIF0oIGNvbFNwYW4sIGl0ZW0gKTtcbiAgICAvLyBwb3NpdGlvbiB0aGUgYnJpY2tcbiAgICB2YXIgcG9zaXRpb24gPSB7XG4gICAgICB4OiB0aGlzLmNvbHVtbldpZHRoICogY29sUG9zaXRpb24uY29sLFxuICAgICAgeTogY29sUG9zaXRpb24ueVxuICAgIH07XG4gICAgLy8gYXBwbHkgc2V0SGVpZ2h0IHRvIG5lY2Vzc2FyeSBjb2x1bW5zXG4gICAgdmFyIHNldEhlaWdodCA9IGNvbFBvc2l0aW9uLnkgKyBpdGVtLnNpemUub3V0ZXJIZWlnaHQ7XG4gICAgdmFyIHNldE1heCA9IGNvbFNwYW4gKyBjb2xQb3NpdGlvbi5jb2w7XG4gICAgZm9yICggdmFyIGkgPSBjb2xQb3NpdGlvbi5jb2w7IGkgPCBzZXRNYXg7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXNbaV0gPSBzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9O1xuXG4gIHByb3RvLl9nZXRUb3BDb2xQb3NpdGlvbiA9IGZ1bmN0aW9uKCBjb2xTcGFuICkge1xuICAgIHZhciBjb2xHcm91cCA9IHRoaXMuX2dldFRvcENvbEdyb3VwKCBjb2xTcGFuICk7XG4gICAgLy8gZ2V0IHRoZSBtaW5pbXVtIFkgdmFsdWUgZnJvbSB0aGUgY29sdW1uc1xuICAgIHZhciBtaW5pbXVtWSA9IE1hdGgubWluLmFwcGx5KCBNYXRoLCBjb2xHcm91cCApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogY29sR3JvdXAuaW5kZXhPZiggbWluaW11bVkgKSxcbiAgICAgIHk6IG1pbmltdW1ZLFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjb2xTcGFuIC0gbnVtYmVyIG9mIGNvbHVtbnMgdGhlIGVsZW1lbnQgc3BhbnNcbiAgICogQHJldHVybnMge0FycmF5fSBjb2xHcm91cFxuICAgKi9cbiAgcHJvdG8uX2dldFRvcENvbEdyb3VwID0gZnVuY3Rpb24oIGNvbFNwYW4gKSB7XG4gICAgaWYgKCBjb2xTcGFuIDwgMiApIHtcbiAgICAgIC8vIGlmIGJyaWNrIHNwYW5zIG9ubHkgb25lIGNvbHVtbiwgdXNlIGFsbCB0aGUgY29sdW1uIFlzXG4gICAgICByZXR1cm4gdGhpcy5jb2xZcztcbiAgICB9XG5cbiAgICB2YXIgY29sR3JvdXAgPSBbXTtcbiAgICAvLyBob3cgbWFueSBkaWZmZXJlbnQgcGxhY2VzIGNvdWxkIHRoaXMgYnJpY2sgZml0IGhvcml6b250YWxseVxuICAgIHZhciBncm91cENvdW50ID0gdGhpcy5jb2xzICsgMSAtIGNvbFNwYW47XG4gICAgLy8gZm9yIGVhY2ggZ3JvdXAgcG90ZW50aWFsIGhvcml6b250YWwgcG9zaXRpb25cbiAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBncm91cENvdW50OyBpKysgKSB7XG4gICAgICBjb2xHcm91cFtpXSA9IHRoaXMuX2dldENvbEdyb3VwWSggaSwgY29sU3BhbiApO1xuICAgIH1cbiAgICByZXR1cm4gY29sR3JvdXA7XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbEdyb3VwWSA9IGZ1bmN0aW9uKCBjb2wsIGNvbFNwYW4gKSB7XG4gICAgaWYgKCBjb2xTcGFuIDwgMiApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbFlzWyBjb2wgXTtcbiAgICB9XG4gICAgLy8gbWFrZSBhbiBhcnJheSBvZiBjb2xZIHZhbHVlcyBmb3IgdGhhdCBvbmUgZ3JvdXBcbiAgICB2YXIgZ3JvdXBDb2xZcyA9IHRoaXMuY29sWXMuc2xpY2UoIGNvbCwgY29sICsgY29sU3BhbiApO1xuICAgIC8vIGFuZCBnZXQgdGhlIG1heCB2YWx1ZSBvZiB0aGUgYXJyYXlcbiAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoIE1hdGgsIGdyb3VwQ29sWXMgKTtcbiAgfTtcblxuICAvLyBnZXQgY29sdW1uIHBvc2l0aW9uIGJhc2VkIG9uIGhvcml6b250YWwgaW5kZXguICM4NzNcbiAgcHJvdG8uX2dldEhvcml6b250YWxDb2xQb3NpdGlvbiA9IGZ1bmN0aW9uKCBjb2xTcGFuLCBpdGVtICkge1xuICAgIHZhciBjb2wgPSB0aGlzLmhvcml6b250YWxDb2xJbmRleCAlIHRoaXMuY29scztcbiAgICB2YXIgaXNPdmVyID0gY29sU3BhbiA+IDEgJiYgY29sICsgY29sU3BhbiA+IHRoaXMuY29scztcbiAgICAvLyBzaGlmdCB0byBuZXh0IHJvdyBpZiBpdGVtIGNhbid0IGZpdCBvbiBjdXJyZW50IHJvd1xuICAgIGNvbCA9IGlzT3ZlciA/IDAgOiBjb2w7XG4gICAgLy8gZG9uJ3QgbGV0IHplcm8tc2l6ZSBpdGVtcyB0YWtlIHVwIHNwYWNlXG4gICAgdmFyIGhhc1NpemUgPSBpdGVtLnNpemUub3V0ZXJXaWR0aCAmJiBpdGVtLnNpemUub3V0ZXJIZWlnaHQ7XG4gICAgdGhpcy5ob3Jpem9udGFsQ29sSW5kZXggPSBoYXNTaXplID8gY29sICsgY29sU3BhbiA6IHRoaXMuaG9yaXpvbnRhbENvbEluZGV4O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogY29sLFxuICAgICAgeTogdGhpcy5fZ2V0Q29sR3JvdXBZKCBjb2wsIGNvbFNwYW4gKSxcbiAgICB9O1xuICB9O1xuXG4gIHByb3RvLl9tYW5hZ2VTdGFtcCA9IGZ1bmN0aW9uKCBzdGFtcCApIHtcbiAgICB2YXIgc3RhbXBTaXplID0gZ2V0U2l6ZSggc3RhbXAgKTtcbiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fZ2V0RWxlbWVudE9mZnNldCggc3RhbXAgKTtcbiAgICAvLyBnZXQgdGhlIGNvbHVtbnMgdGhhdCB0aGlzIHN0YW1wIGFmZmVjdHNcbiAgICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gICAgdmFyIGZpcnN0WCA9IGlzT3JpZ2luTGVmdCA/IG9mZnNldC5sZWZ0IDogb2Zmc2V0LnJpZ2h0O1xuICAgIHZhciBsYXN0WCA9IGZpcnN0WCArIHN0YW1wU2l6ZS5vdXRlcldpZHRoO1xuICAgIHZhciBmaXJzdENvbCA9IE1hdGguZmxvb3IoIGZpcnN0WCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICBmaXJzdENvbCA9IE1hdGgubWF4KCAwLCBmaXJzdENvbCApO1xuICAgIHZhciBsYXN0Q29sID0gTWF0aC5mbG9vciggbGFzdFggLyB0aGlzLmNvbHVtbldpZHRoICk7XG4gICAgLy8gbGFzdENvbCBzaG91bGQgbm90IGdvIG92ZXIgaWYgbXVsdGlwbGUgb2YgY29sdW1uV2lkdGggIzQyNVxuICAgIGxhc3RDb2wgLT0gbGFzdFggJSB0aGlzLmNvbHVtbldpZHRoID8gMCA6IDE7XG4gICAgbGFzdENvbCA9IE1hdGgubWluKCB0aGlzLmNvbHMgLSAxLCBsYXN0Q29sICk7XG4gICAgLy8gc2V0IGNvbFlzIHRvIGJvdHRvbSBvZiB0aGUgc3RhbXBcblxuICAgIHZhciBpc09yaWdpblRvcCA9IHRoaXMuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG4gICAgdmFyIHN0YW1wTWF4WSA9ICggaXNPcmlnaW5Ub3AgPyBvZmZzZXQudG9wIDogb2Zmc2V0LmJvdHRvbSApICtcbiAgICAgIHN0YW1wU2l6ZS5vdXRlckhlaWdodDtcbiAgICBmb3IgKCB2YXIgaSA9IGZpcnN0Q29sOyBpIDw9IGxhc3RDb2w7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXNbaV0gPSBNYXRoLm1heCggc3RhbXBNYXhZLCB0aGlzLmNvbFlzW2ldICk7XG4gICAgfVxuICB9O1xuXG4gIHByb3RvLl9nZXRDb250YWluZXJTaXplID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXguYXBwbHkoIE1hdGgsIHRoaXMuY29sWXMgKTtcbiAgICB2YXIgc2l6ZSA9IHtcbiAgICAgIGhlaWdodDogdGhpcy5tYXhZXG4gICAgfTtcblxuICAgIGlmICggdGhpcy5fZ2V0T3B0aW9uKCdmaXRXaWR0aCcpICkge1xuICAgICAgc2l6ZS53aWR0aCA9IHRoaXMuX2dldENvbnRhaW5lckZpdFdpZHRoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemU7XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbnRhaW5lckZpdFdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHVudXNlZENvbHMgPSAwO1xuICAgIC8vIGNvdW50IHVudXNlZCBjb2x1bW5zXG4gICAgdmFyIGkgPSB0aGlzLmNvbHM7XG4gICAgd2hpbGUgKCAtLWkgKSB7XG4gICAgICBpZiAoIHRoaXMuY29sWXNbaV0gIT09IDAgKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdW51c2VkQ29scysrO1xuICAgIH1cbiAgICAvLyBmaXQgY29udGFpbmVyIHRvIGNvbHVtbnMgdGhhdCBoYXZlIGJlZW4gdXNlZFxuICAgIHJldHVybiAoIHRoaXMuY29scyAtIHVudXNlZENvbHMgKSAqIHRoaXMuY29sdW1uV2lkdGggLSB0aGlzLmd1dHRlcjtcbiAgfTtcblxuICBwcm90by5uZWVkc1Jlc2l6ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwcmV2aW91c1dpZHRoID0gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICB0aGlzLmdldENvbnRhaW5lcldpZHRoKCk7XG4gICAgcmV0dXJuIHByZXZpb3VzV2lkdGggIT0gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgfTtcblxuICByZXR1cm4gTWFzb25yeTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/masonry-layout/masonry.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/morphdom/dist/morphdom-esm.js":
+/*!****************************************************!*\
+ !*** ./node_modules/morphdom/dist/morphdom-esm.js ***!
+ \****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n var toNodeAttrs = toNode.attributes;\n var attr;\n var attrName;\n var attrNamespaceURI;\n var attrValue;\n var fromValue;\n\n // document-fragments dont have attributes so lets not do anything\n if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n // update attributes on original DOM element\n for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n attr = toNodeAttrs[i];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n attrValue = attr.value;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n if (fromValue !== attrValue) {\n if (attr.prefix === 'xmlns'){\n attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n }\n fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n }\n } else {\n fromValue = fromNode.getAttribute(attrName);\n\n if (fromValue !== attrValue) {\n fromNode.setAttribute(attrName, attrValue);\n }\n }\n }\n\n // Remove any extra attributes found on the original DOM element that\n // weren't found on the target element.\n var fromNodeAttrs = fromNode.attributes;\n\n for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n attr = fromNodeAttrs[d];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n\n if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n }\n } else {\n if (!toNode.hasAttribute(attrName)) {\n fromNode.removeAttribute(attrName);\n }\n }\n }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n var template = doc.createElement('template');\n template.innerHTML = str;\n return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n if (!range) {\n range = doc.createRange();\n range.selectNode(doc.body);\n }\n\n var fragment = range.createContextualFragment(str);\n return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n var fragment = doc.createElement('body');\n fragment.innerHTML = str;\n return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n str = str.trim();\n if (HAS_TEMPLATE_SUPPORT) {\n // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n // createContextualFragment doesn't support\n // <template> support not available in IE\n return createFragmentFromTemplate(str);\n } else if (HAS_RANGE_SUPPORT) {\n return createFragmentFromRange(str);\n }\n\n return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n * nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n var fromNodeName = fromEl.nodeName;\n var toNodeName = toEl.nodeName;\n\n if (fromNodeName === toNodeName) {\n return true;\n }\n\n if (toEl.actualize &&\n fromNodeName.charCodeAt(0) < 91 && /* from tag name is upper case */\n toNodeName.charCodeAt(0) > 90 /* target tag name is lower case */) {\n // If the target element is a virtual DOM node then we may need to normalize the tag name\n // before comparing. Normal HTML elements that are in the \"http://www.w3.org/1999/xhtml\"\n // are converted to upper case\n return fromNodeName === toNodeName.toUpperCase();\n } else {\n return false;\n }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n return !namespaceURI || namespaceURI === NS_XHTML ?\n doc.createElement(name) :\n doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n var curChild = fromEl.firstChild;\n while (curChild) {\n var nextChild = curChild.nextSibling;\n toEl.appendChild(curChild);\n curChild = nextChild;\n }\n return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n if (fromEl[name] !== toEl[name]) {\n fromEl[name] = toEl[name];\n if (fromEl[name]) {\n fromEl.setAttribute(name, '');\n } else {\n fromEl.removeAttribute(name);\n }\n }\n}\n\nvar specialElHandlers = {\n OPTION: function(fromEl, toEl) {\n var parentNode = fromEl.parentNode;\n if (parentNode) {\n var parentName = parentNode.nodeName.toUpperCase();\n if (parentName === 'OPTGROUP') {\n parentNode = parentNode.parentNode;\n parentName = parentNode && parentNode.nodeName.toUpperCase();\n }\n if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n if (fromEl.hasAttribute('selected') && !toEl.selected) {\n // Workaround for MS Edge bug where the 'selected' attribute can only be\n // removed if set to a non-empty value:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n fromEl.setAttribute('selected', 'selected');\n fromEl.removeAttribute('selected');\n }\n // We have to reset select element's selectedIndex to -1, otherwise setting\n // fromEl.selected using the syncBooleanAttrProp below has no effect.\n // The correct selectedIndex will be set in the SELECT special handler below.\n parentNode.selectedIndex = -1;\n }\n }\n syncBooleanAttrProp(fromEl, toEl, 'selected');\n },\n /**\n * The \"value\" attribute is special for the <input> element since it sets\n * the initial value. Changing the \"value\" attribute without changing the\n * \"value\" property will have no effect since it is only used to the set the\n * initial value. Similar for the \"checked\" attribute, and \"disabled\".\n */\n INPUT: function(fromEl, toEl) {\n syncBooleanAttrProp(fromEl, toEl, 'checked');\n syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n if (fromEl.value !== toEl.value) {\n fromEl.value = toEl.value;\n }\n\n if (!toEl.hasAttribute('value')) {\n fromEl.removeAttribute('value');\n }\n },\n\n TEXTAREA: function(fromEl, toEl) {\n var newValue = toEl.value;\n if (fromEl.value !== newValue) {\n fromEl.value = newValue;\n }\n\n var firstChild = fromEl.firstChild;\n if (firstChild) {\n // Needed for IE. Apparently IE sets the placeholder as the\n // node value and vise versa. This ignores an empty update.\n var oldValue = firstChild.nodeValue;\n\n if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n return;\n }\n\n firstChild.nodeValue = newValue;\n }\n },\n SELECT: function(fromEl, toEl) {\n if (!toEl.hasAttribute('multiple')) {\n var selectedIndex = -1;\n var i = 0;\n // We have to loop through children of fromEl, not toEl since nodes can be moved\n // from toEl to fromEl directly when morphing.\n // At the time this special handler is invoked, all children have already been morphed\n // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n var curChild = fromEl.firstChild;\n var optgroup;\n var nodeName;\n while(curChild) {\n nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n if (nodeName === 'OPTGROUP') {\n optgroup = curChild;\n curChild = optgroup.firstChild;\n } else {\n if (nodeName === 'OPTION') {\n if (curChild.hasAttribute('selected')) {\n selectedIndex = i;\n break;\n }\n i++;\n }\n curChild = curChild.nextSibling;\n if (!curChild && optgroup) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n }\n }\n\n fromEl.selectedIndex = selectedIndex;\n }\n }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n if (node) {\n return (node.getAttribute && node.getAttribute('id')) || node.id;\n }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n return function morphdom(fromNode, toNode, options) {\n if (!options) {\n options = {};\n }\n\n if (typeof toNode === 'string') {\n if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML') {\n var toNodeHtml = toNode;\n toNode = doc.createElement('html');\n toNode.innerHTML = toNodeHtml;\n } else {\n toNode = toElement(toNode);\n }\n }\n\n var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n var onNodeAdded = options.onNodeAdded || noop;\n var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n var onElUpdated = options.onElUpdated || noop;\n var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n var onNodeDiscarded = options.onNodeDiscarded || noop;\n var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n var childrenOnly = options.childrenOnly === true;\n\n // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n var fromNodesLookup = Object.create(null);\n var keyedRemovalList = [];\n\n function addKeyedRemoval(key) {\n keyedRemovalList.push(key);\n }\n\n function walkDiscardedChildNodes(node, skipKeyedNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n var curChild = node.firstChild;\n while (curChild) {\n\n var key = undefined;\n\n if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n // If we are skipping keyed nodes then we add the key\n // to a list so that it can be handled at the very end.\n addKeyedRemoval(key);\n } else {\n // Only report the node as discarded if it is not keyed. We do this because\n // at the end we loop through all keyed elements that were unmatched\n // and then discard them in one final pass.\n onNodeDiscarded(curChild);\n if (curChild.firstChild) {\n walkDiscardedChildNodes(curChild, skipKeyedNodes);\n }\n }\n\n curChild = curChild.nextSibling;\n }\n }\n }\n\n /**\n * Removes a DOM node out of the original DOM\n *\n * @param {Node} node The node to remove\n * @param {Node} parentNode The nodes parent\n * @param {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n * @return {undefined}\n */\n function removeNode(node, parentNode, skipKeyedNodes) {\n if (onBeforeNodeDiscarded(node) === false) {\n return;\n }\n\n if (parentNode) {\n parentNode.removeChild(node);\n }\n\n onNodeDiscarded(node);\n walkDiscardedChildNodes(node, skipKeyedNodes);\n }\n\n // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n // function indexTree(root) {\n // var treeWalker = document.createTreeWalker(\n // root,\n // NodeFilter.SHOW_ELEMENT);\n //\n // var el;\n // while((el = treeWalker.nextNode())) {\n // var key = getNodeKey(el);\n // if (key) {\n // fromNodesLookup[key] = el;\n // }\n // }\n // }\n\n // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n //\n // function indexTree(node) {\n // var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n // var el;\n // while((el = nodeIterator.nextNode())) {\n // var key = getNodeKey(el);\n // if (key) {\n // fromNodesLookup[key] = el;\n // }\n // }\n // }\n\n function indexTree(node) {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = getNodeKey(curChild);\n if (key) {\n fromNodesLookup[key] = curChild;\n }\n\n // Walk recursively\n indexTree(curChild);\n\n curChild = curChild.nextSibling;\n }\n }\n }\n\n indexTree(fromNode);\n\n function handleNodeAdded(el) {\n onNodeAdded(el);\n\n var curChild = el.firstChild;\n while (curChild) {\n var nextSibling = curChild.nextSibling;\n\n var key = getNodeKey(curChild);\n if (key) {\n var unmatchedFromEl = fromNodesLookup[key];\n if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n morphEl(unmatchedFromEl, curChild);\n }\n }\n\n handleNodeAdded(curChild);\n curChild = nextSibling;\n }\n }\n\n function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n // We have processed all of the \"to nodes\". If curFromNodeChild is\n // non-null then we still have some from nodes left over that need\n // to be removed\n while (curFromNodeChild) {\n var fromNextSibling = curFromNodeChild.nextSibling;\n if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n curFromNodeChild = fromNextSibling;\n }\n }\n\n function morphEl(fromEl, toEl, childrenOnly) {\n var toElKey = getNodeKey(toEl);\n\n if (toElKey) {\n // If an element with an ID is being morphed then it will be in the final\n // DOM so clear it out of the saved elements collection\n delete fromNodesLookup[toElKey];\n }\n\n if (!childrenOnly) {\n // optional\n if (onBeforeElUpdated(fromEl, toEl) === false) {\n return;\n }\n\n // update attributes on original DOM element first\n morphAttrs(fromEl, toEl);\n // optional\n onElUpdated(fromEl);\n\n if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n return;\n }\n }\n\n if (fromEl.nodeName !== 'TEXTAREA') {\n morphChildren(fromEl, toEl);\n } else {\n specialElHandlers.TEXTAREA(fromEl, toEl);\n }\n }\n\n function morphChildren(fromEl, toEl) {\n var curToNodeChild = toEl.firstChild;\n var curFromNodeChild = fromEl.firstChild;\n var curToNodeKey;\n var curFromNodeKey;\n\n var fromNextSibling;\n var toNextSibling;\n var matchingFromEl;\n\n // walk the children\n outer: while (curToNodeChild) {\n toNextSibling = curToNodeChild.nextSibling;\n curToNodeKey = getNodeKey(curToNodeChild);\n\n // walk the fromNode children all the way through\n while (curFromNodeChild) {\n fromNextSibling = curFromNodeChild.nextSibling;\n\n if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n\n curFromNodeKey = getNodeKey(curFromNodeChild);\n\n var curFromNodeType = curFromNodeChild.nodeType;\n\n // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n var isCompatible = undefined;\n\n if (curFromNodeType === curToNodeChild.nodeType) {\n if (curFromNodeType === ELEMENT_NODE) {\n // Both nodes being compared are Element nodes\n\n if (curToNodeKey) {\n // The target node has a key so we want to match it up with the correct element\n // in the original DOM tree\n if (curToNodeKey !== curFromNodeKey) {\n // The current element in the original DOM tree does not have a matching key so\n // let's check our lookup to see if there is a matching element in the original\n // DOM tree\n if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n if (fromNextSibling === matchingFromEl) {\n // Special case for single element removals. To avoid removing the original\n // DOM node out of the tree (since that can break CSS transitions, etc.),\n // we will instead discard the current node and wait until the next\n // iteration to properly match up the keyed target element with its matching\n // element in the original tree\n isCompatible = false;\n } else {\n // We found a matching keyed element somewhere in the original DOM tree.\n // Let's move the original DOM node into the current position and morph\n // it.\n\n // NOTE: We use insertBefore instead of replaceChild because we want to go through\n // the `removeNode()` function for the node that is being discarded so that\n // all lifecycle hooks are correctly invoked\n fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n // fromNextSibling = curFromNodeChild.nextSibling;\n\n if (curFromNodeKey) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n\n curFromNodeChild = matchingFromEl;\n }\n } else {\n // The nodes are not compatible since the \"to\" node has a key and there\n // is no matching keyed node in the source tree\n isCompatible = false;\n }\n }\n } else if (curFromNodeKey) {\n // The original has a key\n isCompatible = false;\n }\n\n isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n if (isCompatible) {\n // We found compatible DOM elements so transform\n // the current \"from\" node to match the current\n // target DOM node.\n // MORPH\n morphEl(curFromNodeChild, curToNodeChild);\n }\n\n } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n // Both nodes being compared are Text or Comment nodes\n isCompatible = true;\n // Simply update nodeValue on the original node to\n // change the text value\n if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n }\n\n }\n }\n\n if (isCompatible) {\n // Advance both the \"to\" child and the \"from\" child since we found a match\n // Nothing else to do as we already recursively called morphChildren above\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n\n // No compatible match so remove the old node from the DOM and continue trying to find a\n // match in the original DOM. However, we only do this if the from node is not keyed\n // since it is possible that a keyed node might match up with a node somewhere else in the\n // target tree and we don't want to discard it just yet since it still might find a\n // home in the final DOM tree. After everything is done we will remove any keyed nodes\n // that didn't find a home\n if (curFromNodeKey) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n\n curFromNodeChild = fromNextSibling;\n } // END: while(curFromNodeChild) {}\n\n // If we got this far then we did not find a candidate match for\n // our \"to node\" and we exhausted all of the children \"from\"\n // nodes. Therefore, we will just append the current \"to\" node\n // to the end\n if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n fromEl.appendChild(matchingFromEl);\n // MORPH\n morphEl(matchingFromEl, curToNodeChild);\n } else {\n var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n if (onBeforeNodeAddedResult !== false) {\n if (onBeforeNodeAddedResult) {\n curToNodeChild = onBeforeNodeAddedResult;\n }\n\n if (curToNodeChild.actualize) {\n curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n }\n fromEl.appendChild(curToNodeChild);\n handleNodeAdded(curToNodeChild);\n }\n }\n\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n }\n\n cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n var specialElHandler = specialElHandlers[fromEl.nodeName];\n if (specialElHandler) {\n specialElHandler(fromEl, toEl);\n }\n } // END: morphChildren(...)\n\n var morphedNode = fromNode;\n var morphedNodeType = morphedNode.nodeType;\n var toNodeType = toNode.nodeType;\n\n if (!childrenOnly) {\n // Handle the case where we are given two DOM nodes that are not\n // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n if (morphedNodeType === ELEMENT_NODE) {\n if (toNodeType === ELEMENT_NODE) {\n if (!compareNodeNames(fromNode, toNode)) {\n onNodeDiscarded(fromNode);\n morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n }\n } else {\n // Going from an element node to a text node\n morphedNode = toNode;\n }\n } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n if (toNodeType === morphedNodeType) {\n if (morphedNode.nodeValue !== toNode.nodeValue) {\n morphedNode.nodeValue = toNode.nodeValue;\n }\n\n return morphedNode;\n } else {\n // Text node to something else\n morphedNode = toNode;\n }\n }\n }\n\n if (morphedNode === toNode) {\n // The \"to node\" was not compatible with the \"from node\" so we had to\n // toss out the \"from node\" and use the \"to node\"\n onNodeDiscarded(fromNode);\n } else {\n if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n return;\n }\n\n morphEl(morphedNode, toNode, childrenOnly);\n\n // We now need to loop over any keyed nodes that might need to be\n // removed. We only do the removal if we know that the keyed node\n // never found a match. When a keyed node is matched up we remove\n // it out of fromNodesLookup and we use fromNodesLookup to determine\n // if a keyed node has been matched up or not\n if (keyedRemovalList) {\n for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n if (elToRemove) {\n removeNode(elToRemove, elToRemove.parentNode, false);\n }\n }\n }\n }\n\n if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n if (morphedNode.actualize) {\n morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n }\n // If we had to swap out the from node with a new node because the old\n // node was not compatible with the target node then we need to\n // replace the old DOM node in the original DOM tree. This is only\n // possible if the original DOM node was part of a DOM tree which\n // we know is the case if it has a parent node.\n fromNode.parentNode.replaceChild(morphedNode, fromNode);\n }\n\n return morphedNode;\n };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (morphdom);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbW9ycGhkb20vZGlzdC9tb3JwaGRvbS1lc20uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzP2ZhZDgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuZnVuY3Rpb24gbW9ycGhBdHRycyhmcm9tTm9kZSwgdG9Ob2RlKSB7XG4gICAgdmFyIHRvTm9kZUF0dHJzID0gdG9Ob2RlLmF0dHJpYnV0ZXM7XG4gICAgdmFyIGF0dHI7XG4gICAgdmFyIGF0dHJOYW1lO1xuICAgIHZhciBhdHRyTmFtZXNwYWNlVVJJO1xuICAgIHZhciBhdHRyVmFsdWU7XG4gICAgdmFyIGZyb21WYWx1ZTtcblxuICAgIC8vIGRvY3VtZW50LWZyYWdtZW50cyBkb250IGhhdmUgYXR0cmlidXRlcyBzbyBsZXRzIG5vdCBkbyBhbnl0aGluZ1xuICAgIGlmICh0b05vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgZnJvbU5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudFxuICAgIGZvciAodmFyIGkgPSB0b05vZGVBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhdHRyID0gdG9Ob2RlQXR0cnNbaV07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHIudmFsdWU7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyLnByZWZpeCA9PT0gJ3htbG5zJyl7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lOyAvLyBJdCdzIG5vdCBhbGxvd2VkIHRvIHNldCBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgWE1MTlMgbmFtZXNwYWNlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgYHhtbG5zYCBwcmVmaXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGV4dHJhIGF0dHJpYnV0ZXMgZm91bmQgb24gdGhlIG9yaWdpbmFsIERPTSBlbGVtZW50IHRoYXRcbiAgICAvLyB3ZXJlbid0IGZvdW5kIG9uIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAgICB2YXIgZnJvbU5vZGVBdHRycyA9IGZyb21Ob2RlLmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBkID0gZnJvbU5vZGVBdHRycy5sZW5ndGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICBhdHRyID0gZnJvbU5vZGVBdHRyc1tkXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcblxuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciByYW5nZTsgLy8gQ3JlYXRlIGEgcmFuZ2Ugb2JqZWN0IGZvciBlZmZpY2VudGx5IHJlbmRlcmluZyBzdHJpbmdzIHRvIGVsZW1lbnRzLlxudmFyIE5TX1hIVE1MID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuXG52YXIgZG9jID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IGRvY3VtZW50O1xudmFyIEhBU19URU1QTEFURV9TVVBQT1JUID0gISFkb2MgJiYgJ2NvbnRlbnQnIGluIGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xudmFyIEhBU19SQU5HRV9TVVBQT1JUID0gISFkb2MgJiYgZG9jLmNyZWF0ZVJhbmdlICYmICdjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQnIGluIGRvYy5jcmVhdGVSYW5nZSgpO1xuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgICByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKGRvYy5ib2R5KTtcbiAgICB9XG5cbiAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RyKTtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgIGZyYWdtZW50LmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFib3V0IHRoZSBzYW1lXG4gKiB2YXIgaHRtbCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoc3RyLCAndGV4dC9odG1sJyk7XG4gKiByZXR1cm4gaHRtbC5ib2R5LmZpcnN0Q2hpbGQ7XG4gKlxuICogQG1ldGhvZCB0b0VsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gdG9FbGVtZW50KHN0cikge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgaWYgKEhBU19URU1QTEFURV9TVVBQT1JUKSB7XG4gICAgICAvLyBhdm9pZCByZXN0cmljdGlvbnMgb24gY29udGVudCBmb3IgdGhpbmdzIGxpa2UgYDx0cj48dGg+SGk8L3RoPjwvdHI+YCB3aGljaFxuICAgICAgLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3Qgc3VwcG9ydFxuICAgICAgLy8gPHRlbXBsYXRlPiBzdXBwb3J0IG5vdCBhdmFpbGFibGUgaW4gSUVcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpO1xuICAgIH0gZWxzZSBpZiAoSEFTX1JBTkdFX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHR3byBub2RlJ3MgbmFtZXMgYXJlIHRoZSBzYW1lLlxuICpcbiAqIE5PVEU6IFdlIGRvbid0IGJvdGhlciBjaGVja2luZyBgbmFtZXNwYWNlVVJJYCBiZWNhdXNlIHlvdSB3aWxsIG5ldmVyIGZpbmQgdHdvIEhUTUwgZWxlbWVudHMgd2l0aCB0aGUgc2FtZVxuICogICAgICAgbm9kZU5hbWUgYW5kIGRpZmZlcmVudCBuYW1lc3BhY2UgVVJJcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYiBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTmFtZXMoZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGZyb21Ob2RlTmFtZSA9IGZyb21FbC5ub2RlTmFtZTtcbiAgICB2YXIgdG9Ob2RlTmFtZSA9IHRvRWwubm9kZU5hbWU7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0b0VsLmFjdHVhbGl6ZSAmJlxuICAgICAgICBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKSA8IDkxICYmIC8qIGZyb20gdGFnIG5hbWUgaXMgdXBwZXIgY2FzZSAqL1xuICAgICAgICB0b05vZGVOYW1lLmNoYXJDb2RlQXQoMCkgPiA5MCAvKiB0YXJnZXQgdGFnIG5hbWUgaXMgbG93ZXIgY2FzZSAqLykge1xuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSB2aXJ0dWFsIERPTSBub2RlIHRoZW4gd2UgbWF5IG5lZWQgdG8gbm9ybWFsaXplIHRoZSB0YWcgbmFtZVxuICAgICAgICAvLyBiZWZvcmUgY29tcGFyaW5nLiBOb3JtYWwgSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAgICAgLy8gYXJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlXG4gICAgICAgIHJldHVybiBmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnT1BUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoaWxkLmhhc0F0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VyQ2hpbGQgJiYgb3B0Z3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gb3B0Z3JvdXAubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyb21FbC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUkMSA9IDExO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXROb2RlS2V5KG5vZGUpIHtcbiAgaWYgKG5vZGUpIHtcbiAgICAgIHJldHVybiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykpIHx8IG5vZGUuaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpIHtcblxuICAgIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgICAgICAgICB0b05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgnaHRtbCcpO1xuICAgICAgICAgICAgICAgIHRvTm9kZS5pbm5lckhUTUwgPSB0b05vZGVIdG1sO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnZXROb2RlS2V5ID0gb3B0aW9ucy5nZXROb2RlS2V5IHx8IGRlZmF1bHRHZXROb2RlS2V5O1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uQmVmb3JlRWxVcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25FbFVwZGF0ZWQgPSBvcHRpb25zLm9uRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbk5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIGNoaWxkcmVuT25seSA9IG9wdGlvbnMuY2hpbGRyZW5Pbmx5ID09PSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgYSBsb29rdXAgdG8gcXVpY2tseSBmaW5kIGFsbCBrZXllZCBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB2YXIga2V5ZWRSZW1vdmFsTGlzdCA9IFtdO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFkZEtleWVkUmVtb3ZhbChrZXkpIHtcbiAgICAgICAgICAgIGtleWVkUmVtb3ZhbExpc3QucHVzaChrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMobm9kZSwgc2tpcEtleWVkTm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcEtleWVkTm9kZXMgJiYgKGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHNraXBwaW5nIGtleWVkIG5vZGVzIHRoZW4gd2UgYWRkIHRoZSBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGEgbGlzdCBzbyB0aGF0IGl0IGNhbiBiZSBoYW5kbGVkIGF0IHRoZSB2ZXJ5IGVuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgdGhlIG5vZGUgYXMgZGlzY2FyZGVkIGlmIGl0IGlzIG5vdCBrZXllZC4gV2UgZG8gdGhpcyBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIHdlIGxvb3AgdGhyb3VnaCBhbGwga2V5ZWQgZWxlbWVudHMgdGhhdCB3ZXJlIHVubWF0Y2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gZGlzY2FyZCB0aGVtIGluIG9uZSBmaW5hbCBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMoY3VyQ2hpbGQsIHNraXBLZXllZE5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZVxuICAgICAgICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAgICAgICogQHBhcmFtICB7Qm9vbGVhbn0gc2tpcEtleWVkTm9kZXMgSWYgdHJ1ZSB0aGVuIGVsZW1lbnRzIHdpdGgga2V5cyB3aWxsIGJlIHNraXBwZWQgYW5kIG5vdCBkaXNjYXJkZWQuXG4gICAgICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSwgcGFyZW50Tm9kZSwgc2tpcEtleWVkTm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVEaXNjYXJkZWQobm9kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChub2RlKTtcbiAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIFRyZWVXYWxrZXIgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluZGV4VHJlZShyb290KSB7XG4gICAgICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgICAgIC8vICAgICAgICAgcm9vdCxcbiAgICAgICAgLy8gICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCkpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgICAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgZnJvbU5vZGVzTG9va3VwW2tleV0gPSBlbDtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAgICAgLy8gICAgIHZhciBlbDtcbiAgICAgICAgLy8gICAgIHdoaWxlKChlbCA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleFRyZWUoZnJvbU5vZGUpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXRjaGVkRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRGcm9tRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgdW5tYXRjaGVkRnJvbUVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAgICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICAgICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlmICgoY3VyRnJvbU5vZGVLZXkgPSBnZXROb2RlS2V5KGN1ckZyb21Ob2RlQ2hpbGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBlbGVtZW50IHdpdGggYW4gSUQgaXMgYmVpbmcgbW9ycGhlZCB0aGVuIGl0IHdpbGwgYmUgaW4gdGhlIGZpbmFsXG4gICAgICAgICAgICAgICAgLy8gRE9NIHNvIGNsZWFyIGl0IG91dCBvZiB0aGUgc2F2ZWQgZWxlbWVudHMgY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbFVwZGF0ZWQoZnJvbUVsLCB0b0VsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbW9ycGhBdHRycyhmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmcm9tRWwubm9kZU5hbWUgIT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgICAgICAgbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcnMuVEVYVEFSRUEoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgICAgICB2YXIgY3VyVG9Ob2RlQ2hpbGQgPSB0b0VsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUtleTtcbiAgICAgICAgICAgIHZhciBjdXJGcm9tTm9kZUtleTtcblxuICAgICAgICAgICAgdmFyIGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgdmFyIG1hdGNoaW5nRnJvbUVsO1xuXG4gICAgICAgICAgICAvLyB3YWxrIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChjdXJUb05vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBjdXJUb05vZGVLZXkgPSBnZXROb2RlS2V5KGN1clRvTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhlIGZyb21Ob2RlIGNoaWxkcmVuIGFsbCB0aGUgd2F5IHRocm91Z2hcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlICYmIGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVUeXBlID0gY3VyRnJvbU5vZGVDaGlsZC5ub2RlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIGlmIHRoZSBjdXJGcm9tTm9kZUNoaWxkIGRvZXNudCBoYXZlIGEgbWF0Y2ggd2l0aCB0aGUgY3VyVG9Ob2RlQ2hpbGRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBjdXJUb05vZGVDaGlsZC5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlS2V5ICE9PSBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIGtleSBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgY2hlY2sgb3VyIGxvb2t1cCB0byBzZWUgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbU5leHRTaWJsaW5nID09PSBtYXRjaGluZ0Zyb21FbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHNpbmdsZSBlbGVtZW50IHJlbW92YWxzLiBUbyBhdm9pZCByZW1vdmluZyB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGluc3RlYWQgZGlzY2FyZCB0aGUgY3VycmVudCBub2RlIGFuZCB3YWl0IHVudGlsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiB0byBwcm9wZXJseSBtYXRjaCB1cCB0aGUga2V5ZWQgdGFyZ2V0IGVsZW1lbnQgd2l0aCBpdHMgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoaW5nIGtleWVkIGVsZW1lbnQgc29tZXdoZXJlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgbW92ZSB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgaW50byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgbW9ycGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogV2UgdXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIHJlcGxhY2VDaGlsZCBiZWNhdXNlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYHJlbW92ZU5vZGUoKWAgZnVuY3Rpb24gZm9yIHRoZSBub2RlIHRoYXQgaXMgYmVpbmcgZGlzY2FyZGVkIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmluc2VydEJlZm9yZShtYXRjaGluZ0Zyb21FbCwgY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vIG1hdGNoaW5nIGtleWVkIG5vZGUgaW4gdGhlIHNvdXJjZSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBoYXMgYSBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gaXNDb21wYXRpYmxlICE9PSBmYWxzZSAmJiBjb21wYXJlTm9kZU5hbWVzKGN1ckZyb21Ob2RlQ2hpbGQsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGNvbXBhdGlibGUgRE9NIGVsZW1lbnRzIHNvIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBcImZyb21cIiBub2RlIHRvIG1hdGNoIHRoZSBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhFbChjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IGN1ckZyb21Ob2RlVHlwZSA9PSBDT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBseSB1cGRhdGUgbm9kZVZhbHVlIG9uIHRoZSBvcmlnaW5hbCBub2RlIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlICE9PSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIGJvdGggdGhlIFwidG9cIiBjaGlsZCBhbmQgdGhlIFwiZnJvbVwiIGNoaWxkIHNpbmNlIHdlIGZvdW5kIGEgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgZWxzZSB0byBkbyBhcyB3ZSBhbHJlYWR5IHJlY3Vyc2l2ZWx5IGNhbGxlZCBtb3JwaENoaWxkcmVuIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIGluIHRoZSBvcmlnaW5hbCBET00uIEhvd2V2ZXIsIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgZnJvbSBub2RlIGlzIG5vdCBrZXllZFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGEga2V5ZWQgbm9kZSBtaWdodCBtYXRjaCB1cCB3aXRoIGEgbm9kZSBzb21ld2hlcmUgZWxzZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gaG9tZSBpbiB0aGUgZmluYWwgRE9NIHRyZWUuIEFmdGVyIGV2ZXJ5dGhpbmcgaXMgZG9uZSB3ZSB3aWxsIHJlbW92ZSBhbnkga2V5ZWQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBkaWRuJ3QgZmluZCBhIGhvbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSAvLyBFTkQ6IHdoaWxlKGN1ckZyb21Ob2RlQ2hpbGQpIHt9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiB3ZSBkaWQgbm90IGZpbmQgYSBjYW5kaWRhdGUgbWF0Y2ggZm9yXG4gICAgICAgICAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAgICAgICAgIC8vIG5vZGVzLiBUaGVyZWZvcmUsIHdlIHdpbGwganVzdCBhcHBlbmQgdGhlIGN1cnJlbnQgXCJ0b1wiIG5vZGVcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChtYXRjaGluZ0Zyb21FbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVBZGRlZFJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVBZGRlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IGN1clRvTm9kZUNoaWxkLmFjdHVhbGl6ZShmcm9tRWwub3duZXJEb2N1bWVudCB8fCBkb2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmFwcGVuZENoaWxkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KTtcblxuICAgICAgICAgICAgdmFyIHNwZWNpYWxFbEhhbmRsZXIgPSBzcGVjaWFsRWxIYW5kbGVyc1tmcm9tRWwubm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxFbEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsRWxIYW5kbGVyKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRU5EOiBtb3JwaENoaWxkcmVuKC4uLilcblxuICAgICAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICAgICAgdmFyIG1vcnBoZWROb2RlVHlwZSA9IG1vcnBoZWROb2RlLm5vZGVUeXBlO1xuICAgICAgICB2YXIgdG9Ob2RlVHlwZSA9IHRvTm9kZS5ub2RlVHlwZTtcblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR29pbmcgZnJvbSBhbiBlbGVtZW50IG5vZGUgdG8gYSB0ZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBtb3JwaGVkTm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgeyAvLyBUZXh0IG9yIGNvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLm5vZGVWYWx1ZSAhPT0gdG9Ob2RlLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUubm9kZVZhbHVlID0gdG9Ob2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vcnBoZWROb2RlID09PSB0b05vZGUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBcInRvIG5vZGVcIiB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgXCJmcm9tIG5vZGVcIiBzbyB3ZSBoYWQgdG9cbiAgICAgICAgICAgIC8vIHRvc3Mgb3V0IHRoZSBcImZyb20gbm9kZVwiIGFuZCB1c2UgdGhlIFwidG8gbm9kZVwiXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9ycGhFbChtb3JwaGVkTm9kZSwgdG9Ob2RlLCBjaGlsZHJlbk9ubHkpO1xuXG4gICAgICAgICAgICAvLyBXZSBub3cgbmVlZCB0byBsb29wIG92ZXIgYW55IGtleWVkIG5vZGVzIHRoYXQgbWlnaHQgbmVlZCB0byBiZVxuICAgICAgICAgICAgLy8gcmVtb3ZlZC4gV2Ugb25seSBkbyB0aGUgcmVtb3ZhbCBpZiB3ZSBrbm93IHRoYXQgdGhlIGtleWVkIG5vZGVcbiAgICAgICAgICAgIC8vIG5ldmVyIGZvdW5kIGEgbWF0Y2guIFdoZW4gYSBrZXllZCBub2RlIGlzIG1hdGNoZWQgdXAgd2UgcmVtb3ZlXG4gICAgICAgICAgICAvLyBpdCBvdXQgb2YgZnJvbU5vZGVzTG9va3VwIGFuZCB3ZSB1c2UgZnJvbU5vZGVzTG9va3VwIHRvIGRldGVybWluZVxuICAgICAgICAgICAgLy8gaWYgYSBrZXllZCBub2RlIGhhcyBiZWVuIG1hdGNoZWQgdXAgb3Igbm90XG4gICAgICAgICAgICBpZiAoa2V5ZWRSZW1vdmFsTGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWtleWVkUmVtb3ZhbExpc3QubGVuZ3RoOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbFRvUmVtb3ZlID0gZnJvbU5vZGVzTG9va3VwW2tleWVkUmVtb3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hpbGRyZW5Pbmx5ICYmIG1vcnBoZWROb2RlICE9PSBmcm9tTm9kZSAmJiBmcm9tTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobW9ycGhlZE5vZGUuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3JwaGVkTm9kZS5hY3R1YWxpemUoZnJvbU5vZGUub3duZXJEb2N1bWVudCB8fCBkb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgaGFkIHRvIHN3YXAgb3V0IHRoZSBmcm9tIG5vZGUgd2l0aCBhIG5ldyBub2RlIGJlY2F1c2UgdGhlIG9sZFxuICAgICAgICAgICAgLy8gbm9kZSB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IG5vZGUgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBvbGQgRE9NIG5vZGUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLiBUaGlzIGlzIG9ubHlcbiAgICAgICAgICAgIC8vIHBvc3NpYmxlIGlmIHRoZSBvcmlnaW5hbCBET00gbm9kZSB3YXMgcGFydCBvZiBhIERPTSB0cmVlIHdoaWNoXG4gICAgICAgICAgICAvLyB3ZSBrbm93IGlzIHRoZSBjYXNlIGlmIGl0IGhhcyBhIHBhcmVudCBub2RlLlxuICAgICAgICAgICAgZnJvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobW9ycGhlZE5vZGUsIGZyb21Ob2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICB9O1xufVxuXG52YXIgbW9ycGhkb20gPSBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycyk7XG5cbmV4cG9ydCBkZWZhdWx0IG1vcnBoZG9tO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/morphdom/dist/morphdom-esm.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/outlayer/item.js":
+/*!***************************************!*\
+ !*** ./node_modules/outlayer/item.js ***!
+ \***************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\")\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n var x = parseFloat( xValue );\n var y = parseFloat( yValue );\n // convert percent to pixels\n var layoutSize = this.layout.size;\n if ( xValue.indexOf('%') != -1 ) {\n x = ( x / 100 ) * layoutSize.width;\n }\n if ( yValue.indexOf('%') != -1 ) {\n y = ( y / 100 ) * layoutSize.height;\n }\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var didNotMove = x == this.position.x && y == this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseFloat( x );\n this.position.y = parseFloat( y );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvb3V0bGF5ZXIvaXRlbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvb3V0bGF5ZXIvaXRlbS5qcz8yOGFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3V0bGF5ZXIgSXRlbVxuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTUQgLSBSZXF1aXJlSlNcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcicsXG4gICAgICAgICdnZXQtc2l6ZS9nZXQtc2l6ZSdcbiAgICAgIF0sXG4gICAgICBmYWN0b3J5XG4gICAgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KUyAtIEJyb3dzZXJpZnksIFdlYnBhY2tcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJyksXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5PdXRsYXllciA9IHt9O1xuICAgIHdpbmRvdy5PdXRsYXllci5JdGVtID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCBFdkVtaXR0ZXIsIGdldFNpemUgKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tIGhlbHBlcnMgLS0tLS0gLy9cblxuZnVuY3Rpb24gaXNFbXB0eU9iaiggb2JqICkge1xuICBmb3IgKCB2YXIgcHJvcCBpbiBvYmogKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3AgPSBudWxsO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1NTMyBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblxudmFyIGRvY0VsZW1TdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxudmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IHR5cGVvZiBkb2NFbGVtU3R5bGUudHJhbnNpdGlvbiA9PSAnc3RyaW5nJyA/XG4gICd0cmFuc2l0aW9uJyA6ICdXZWJraXRUcmFuc2l0aW9uJztcbnZhciB0cmFuc2Zvcm1Qcm9wZXJ0eSA9IHR5cGVvZiBkb2NFbGVtU3R5bGUudHJhbnNmb3JtID09ICdzdHJpbmcnID9cbiAgJ3RyYW5zZm9ybScgOiAnV2Via2l0VHJhbnNmb3JtJztcblxudmFyIHRyYW5zaXRpb25FbmRFdmVudCA9IHtcbiAgV2Via2l0VHJhbnNpdGlvbjogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCdcbn1bIHRyYW5zaXRpb25Qcm9wZXJ0eSBdO1xuXG4vLyBjYWNoZSBhbGwgdmVuZG9yIHByb3BlcnRpZXMgdGhhdCBjb3VsZCBoYXZlIHZlbmRvciBwcmVmaXhcbnZhciB2ZW5kb3JQcm9wZXJ0aWVzID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVByb3BlcnR5LFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uUHJvcGVydHksXG4gIHRyYW5zaXRpb25EdXJhdGlvbjogdHJhbnNpdGlvblByb3BlcnR5ICsgJ0R1cmF0aW9uJyxcbiAgdHJhbnNpdGlvblByb3BlcnR5OiB0cmFuc2l0aW9uUHJvcGVydHkgKyAnUHJvcGVydHknLFxuICB0cmFuc2l0aW9uRGVsYXk6IHRyYW5zaXRpb25Qcm9wZXJ0eSArICdEZWxheSdcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEl0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gSXRlbSggZWxlbWVudCwgbGF5b3V0ICkge1xuICBpZiAoICFlbGVtZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIC8vIHBhcmVudCBsYXlvdXQgY2xhc3MsIGkuZS4gTWFzb25yeSwgSXNvdG9wZSwgb3IgUGFja2VyeVxuICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnZhciBwcm90byA9IEl0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xucHJvdG8uY29uc3RydWN0b3IgPSBJdGVtO1xuXG5wcm90by5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHRyYW5zaXRpb24gb2JqZWN0c1xuICB0aGlzLl90cmFuc24gPSB7XG4gICAgaW5nUHJvcGVydGllczoge30sXG4gICAgY2xlYW46IHt9LFxuICAgIG9uRW5kOiB7fVxuICB9O1xuXG4gIHRoaXMuY3NzKHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICB9KTtcbn07XG5cbi8vIHRyaWdnZXIgc3BlY2lmaWVkIGhhbmRsZXIgZm9yIGV2ZW50IHR5cGVcbnByb3RvLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG59O1xuXG4vKipcbiAqIGFwcGx5IENTUyBzdHlsZXMgdG8gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlXG4gKi9cbnByb3RvLmNzcyA9IGZ1bmN0aW9uKCBzdHlsZSApIHtcbiAgdmFyIGVsZW1TdHlsZSA9IHRoaXMuZWxlbWVudC5zdHlsZTtcblxuICBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgICAvLyB1c2UgdmVuZG9yIHByb3BlcnR5IGlmIGF2YWlsYWJsZVxuICAgIHZhciBzdXBwb3J0ZWRQcm9wID0gdmVuZG9yUHJvcGVydGllc1sgcHJvcCBdIHx8IHByb3A7XG4gICAgZWxlbVN0eWxlWyBzdXBwb3J0ZWRQcm9wIF0gPSBzdHlsZVsgcHJvcCBdO1xuICB9XG59O1xuXG4gLy8gbWVhc3VyZSBwb3NpdGlvbiwgYW5kIHNldHMgaXRcbnByb3RvLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoIHRoaXMuZWxlbWVudCApO1xuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luTGVmdCcpO1xuICB2YXIgaXNPcmlnaW5Ub3AgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgdmFyIHhWYWx1ZSA9IHN0eWxlWyBpc09yaWdpbkxlZnQgPyAnbGVmdCcgOiAncmlnaHQnIF07XG4gIHZhciB5VmFsdWUgPSBzdHlsZVsgaXNPcmlnaW5Ub3AgPyAndG9wJyA6ICdib3R0b20nIF07XG4gIHZhciB4ID0gcGFyc2VGbG9hdCggeFZhbHVlICk7XG4gIHZhciB5ID0gcGFyc2VGbG9hdCggeVZhbHVlICk7XG4gIC8vIGNvbnZlcnQgcGVyY2VudCB0byBwaXhlbHNcbiAgdmFyIGxheW91dFNpemUgPSB0aGlzLmxheW91dC5zaXplO1xuICBpZiAoIHhWYWx1ZS5pbmRleE9mKCclJykgIT0gLTEgKSB7XG4gICAgeCA9ICggeCAvIDEwMCApICogbGF5b3V0U2l6ZS53aWR0aDtcbiAgfVxuICBpZiAoIHlWYWx1ZS5pbmRleE9mKCclJykgIT0gLTEgKSB7XG4gICAgeSA9ICggeSAvIDEwMCApICogbGF5b3V0U2l6ZS5oZWlnaHQ7XG4gIH1cbiAgLy8gY2xlYW4gdXAgJ2F1dG8nIG9yIG90aGVyIG5vbi1pbnRlZ2VyIHZhbHVlc1xuICB4ID0gaXNOYU4oIHggKSA/IDAgOiB4O1xuICB5ID0gaXNOYU4oIHkgKSA/IDAgOiB5O1xuICAvLyByZW1vdmUgcGFkZGluZyBmcm9tIG1lYXN1cmVtZW50XG4gIHggLT0gaXNPcmlnaW5MZWZ0ID8gbGF5b3V0U2l6ZS5wYWRkaW5nTGVmdCA6IGxheW91dFNpemUucGFkZGluZ1JpZ2h0O1xuICB5IC09IGlzT3JpZ2luVG9wID8gbGF5b3V0U2l6ZS5wYWRkaW5nVG9wIDogbGF5b3V0U2l6ZS5wYWRkaW5nQm90dG9tO1xuXG4gIHRoaXMucG9zaXRpb24ueCA9IHg7XG4gIHRoaXMucG9zaXRpb24ueSA9IHk7XG59O1xuXG4vLyBzZXQgc2V0dGxlZCBwb3NpdGlvbiwgYXBwbHkgcGFkZGluZ1xucHJvdG8ubGF5b3V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGxheW91dFNpemUgPSB0aGlzLmxheW91dC5zaXplO1xuICB2YXIgc3R5bGUgPSB7fTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG5cbiAgLy8geFxuICB2YXIgeFBhZGRpbmcgPSBpc09yaWdpbkxlZnQgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gIHZhciB4UHJvcGVydHkgPSBpc09yaWdpbkxlZnQgPyAnbGVmdCcgOiAncmlnaHQnO1xuICB2YXIgeFJlc2V0UHJvcGVydHkgPSBpc09yaWdpbkxlZnQgPyAncmlnaHQnIDogJ2xlZnQnO1xuXG4gIHZhciB4ID0gdGhpcy5wb3NpdGlvbi54ICsgbGF5b3V0U2l6ZVsgeFBhZGRpbmcgXTtcbiAgLy8gc2V0IGluIHBlcmNlbnRhZ2Ugb3IgcGl4ZWxzXG4gIHN0eWxlWyB4UHJvcGVydHkgXSA9IHRoaXMuZ2V0WFZhbHVlKCB4ICk7XG4gIC8vIHJlc2V0IG90aGVyIHByb3BlcnR5XG4gIHN0eWxlWyB4UmVzZXRQcm9wZXJ0eSBdID0gJyc7XG5cbiAgLy8geVxuICB2YXIgeVBhZGRpbmcgPSBpc09yaWdpblRvcCA/ICdwYWRkaW5nVG9wJyA6ICdwYWRkaW5nQm90dG9tJztcbiAgdmFyIHlQcm9wZXJ0eSA9IGlzT3JpZ2luVG9wID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgdmFyIHlSZXNldFByb3BlcnR5ID0gaXNPcmlnaW5Ub3AgPyAnYm90dG9tJyA6ICd0b3AnO1xuXG4gIHZhciB5ID0gdGhpcy5wb3NpdGlvbi55ICsgbGF5b3V0U2l6ZVsgeVBhZGRpbmcgXTtcbiAgLy8gc2V0IGluIHBlcmNlbnRhZ2Ugb3IgcGl4ZWxzXG4gIHN0eWxlWyB5UHJvcGVydHkgXSA9IHRoaXMuZ2V0WVZhbHVlKCB5ICk7XG4gIC8vIHJlc2V0IG90aGVyIHByb3BlcnR5XG4gIHN0eWxlWyB5UmVzZXRQcm9wZXJ0eSBdID0gJyc7XG5cbiAgdGhpcy5jc3MoIHN0eWxlICk7XG4gIHRoaXMuZW1pdEV2ZW50KCAnbGF5b3V0JywgWyB0aGlzIF0gKTtcbn07XG5cbnByb3RvLmdldFhWYWx1ZSA9IGZ1bmN0aW9uKCB4ICkge1xuICB2YXIgaXNIb3Jpem9udGFsID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignaG9yaXpvbnRhbCcpO1xuICByZXR1cm4gdGhpcy5sYXlvdXQub3B0aW9ucy5wZXJjZW50UG9zaXRpb24gJiYgIWlzSG9yaXpvbnRhbCA/XG4gICAgKCAoIHggLyB0aGlzLmxheW91dC5zaXplLndpZHRoICkgKiAxMDAgKSArICclJyA6IHggKyAncHgnO1xufTtcblxucHJvdG8uZ2V0WVZhbHVlID0gZnVuY3Rpb24oIHkgKSB7XG4gIHZhciBpc0hvcml6b250YWwgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdob3Jpem9udGFsJyk7XG4gIHJldHVybiB0aGlzLmxheW91dC5vcHRpb25zLnBlcmNlbnRQb3NpdGlvbiAmJiBpc0hvcml6b250YWwgP1xuICAgICggKCB5IC8gdGhpcy5sYXlvdXQuc2l6ZS5oZWlnaHQgKSAqIDEwMCApICsgJyUnIDogeSArICdweCc7XG59O1xuXG5wcm90by5fdHJhbnNpdGlvblRvID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMuZ2V0UG9zaXRpb24oKTtcbiAgLy8gZ2V0IGN1cnJlbnQgeCAmIHkgZnJvbSB0b3AvbGVmdFxuICB2YXIgY3VyWCA9IHRoaXMucG9zaXRpb24ueDtcbiAgdmFyIGN1clkgPSB0aGlzLnBvc2l0aW9uLnk7XG5cbiAgdmFyIGRpZE5vdE1vdmUgPSB4ID09IHRoaXMucG9zaXRpb24ueCAmJiB5ID09IHRoaXMucG9zaXRpb24ueTtcblxuICAvLyBzYXZlIGVuZCBwb3NpdGlvblxuICB0aGlzLnNldFBvc2l0aW9uKCB4LCB5ICk7XG5cbiAgLy8gaWYgZGlkIG5vdCBtb3ZlIGFuZCBub3QgdHJhbnNpdGlvbmluZywganVzdCBnbyB0byBsYXlvdXRcbiAgaWYgKCBkaWROb3RNb3ZlICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZyApIHtcbiAgICB0aGlzLmxheW91dFBvc2l0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRyYW5zWCA9IHggLSBjdXJYO1xuICB2YXIgdHJhbnNZID0geSAtIGN1clk7XG4gIHZhciB0cmFuc2l0aW9uU3R5bGUgPSB7fTtcbiAgdHJhbnNpdGlvblN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNsYXRlKCB0cmFuc1gsIHRyYW5zWSApO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgdG86IHRyYW5zaXRpb25TdHlsZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IHtcbiAgICAgIHRyYW5zZm9ybTogdGhpcy5sYXlvdXRQb3NpdGlvblxuICAgIH0sXG4gICAgaXNDbGVhbmluZzogdHJ1ZVxuICB9KTtcbn07XG5cbnByb3RvLmdldFRyYW5zbGF0ZSA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICAvLyBmbGlwIGNvb3JpZGluYXRlcyBpZiBvcmlnaW4gb24gcmlnaHQgb3IgYm90dG9tXG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gIHZhciBpc09yaWdpblRvcCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpblRvcCcpO1xuICB4ID0gaXNPcmlnaW5MZWZ0ID8geCA6IC14O1xuICB5ID0gaXNPcmlnaW5Ub3AgPyB5IDogLXk7XG4gIHJldHVybiAndHJhbnNsYXRlM2QoJyArIHggKyAncHgsICcgKyB5ICsgJ3B4LCAwKSc7XG59O1xuXG4vLyBub24gdHJhbnNpdGlvbiArIHRyYW5zZm9ybSBzdXBwb3J0XG5wcm90by5nb1RvID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMuc2V0UG9zaXRpb24oIHgsIHkgKTtcbiAgdGhpcy5sYXlvdXRQb3NpdGlvbigpO1xufTtcblxucHJvdG8ubW92ZVRvID0gcHJvdG8uX3RyYW5zaXRpb25UbztcblxucHJvdG8uc2V0UG9zaXRpb24gPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgdGhpcy5wb3NpdGlvbi54ID0gcGFyc2VGbG9hdCggeCApO1xuICB0aGlzLnBvc2l0aW9uLnkgPSBwYXJzZUZsb2F0KCB5ICk7XG59O1xuXG4vLyAtLS0tLSB0cmFuc2l0aW9uIC0tLS0tIC8vXG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlIC0gQ1NTXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblRyYW5zaXRpb25FbmRcbiAqL1xuXG4vLyBub24gdHJhbnNpdGlvbiwganVzdCB0cmlnZ2VyIGNhbGxiYWNrXG5wcm90by5fbm9uVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCBhcmdzICkge1xuICB0aGlzLmNzcyggYXJncy50byApO1xuICBpZiAoIGFyZ3MuaXNDbGVhbmluZyApIHtcbiAgICB0aGlzLl9yZW1vdmVTdHlsZXMoIGFyZ3MudG8gKTtcbiAgfVxuICBmb3IgKCB2YXIgcHJvcCBpbiBhcmdzLm9uVHJhbnNpdGlvbkVuZCApIHtcbiAgICBhcmdzLm9uVHJhbnNpdGlvbkVuZFsgcHJvcCBdLmNhbGwoIHRoaXMgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwcm9wZXIgdHJhbnNpdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBhcmd1bWVudHNcbiAqICAgQHBhcmFtIHtPYmplY3R9IHRvIC0gc3R5bGUgdG8gdHJhbnNpdGlvbiB0b1xuICogICBAcGFyYW0ge09iamVjdH0gZnJvbSAtIHN0eWxlIHRvIHN0YXJ0IHRyYW5zaXRpb24gZnJvbVxuICogICBAcGFyYW0ge0Jvb2xlYW59IGlzQ2xlYW5pbmcgLSByZW1vdmVzIHRyYW5zaXRpb24gc3R5bGVzIGFmdGVyIHRyYW5zaXRpb25cbiAqICAgQHBhcmFtIHtGdW5jdGlvbn0gb25UcmFuc2l0aW9uRW5kIC0gY2FsbGJhY2tcbiAqL1xucHJvdG8udHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCBhcmdzICkge1xuICAvLyByZWRpcmVjdCB0byBub25UcmFuc2l0aW9uIGlmIG5vIHRyYW5zaXRpb24gZHVyYXRpb25cbiAgaWYgKCAhcGFyc2VGbG9hdCggdGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb24gKSApIHtcbiAgICB0aGlzLl9ub25UcmFuc2l0aW9uKCBhcmdzICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF90cmFuc2l0aW9uID0gdGhpcy5fdHJhbnNuO1xuICAvLyBrZWVwIHRyYWNrIG9mIG9uVHJhbnNpdGlvbkVuZCBjYWxsYmFjayBieSBjc3MgcHJvcGVydHlcbiAgZm9yICggdmFyIHByb3AgaW4gYXJncy5vblRyYW5zaXRpb25FbmQgKSB7XG4gICAgX3RyYW5zaXRpb24ub25FbmRbIHByb3AgXSA9IGFyZ3Mub25UcmFuc2l0aW9uRW5kWyBwcm9wIF07XG4gIH1cbiAgLy8ga2VlcCB0cmFjayBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRyYW5zaXRpb25pbmdcbiAgZm9yICggcHJvcCBpbiBhcmdzLnRvICkge1xuICAgIF90cmFuc2l0aW9uLmluZ1Byb3BlcnRpZXNbIHByb3AgXSA9IHRydWU7XG4gICAgLy8ga2VlcCB0cmFjayBvZiBwcm9wZXJ0aWVzIHRvIGNsZWFuIHVwIHdoZW4gdHJhbnNpdGlvbiBpcyBkb25lXG4gICAgaWYgKCBhcmdzLmlzQ2xlYW5pbmcgKSB7XG4gICAgICBfdHJhbnNpdGlvbi5jbGVhblsgcHJvcCBdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgZnJvbSBzdHlsZXNcbiAgaWYgKCBhcmdzLmZyb20gKSB7XG4gICAgdGhpcy5jc3MoIGFyZ3MuZnJvbSApO1xuICAgIC8vIGZvcmNlIHJlZHJhdy4gaHR0cDovL2Jsb2cuYWxleG1hY2Nhdy5jb20vY3NzLXRyYW5zaXRpb25zXG4gICAgdmFyIGggPSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIC8vIGhhY2sgZm9yIEpTSGludCB0byBodXNoIGFib3V0IHVudXNlZCB2YXJcbiAgICBoID0gbnVsbDtcbiAgfVxuICAvLyBlbmFibGUgdHJhbnNpdGlvblxuICB0aGlzLmVuYWJsZVRyYW5zaXRpb24oIGFyZ3MudG8gKTtcbiAgLy8gc2V0IHN0eWxlcyB0aGF0IGFyZSB0cmFuc2l0aW9uaW5nXG4gIHRoaXMuY3NzKCBhcmdzLnRvICk7XG5cbiAgdGhpcy5pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuXG59O1xuXG4vLyBkYXNoIGJlZm9yZSBhbGwgY2FwIGxldHRlcnMsIGluY2x1ZGluZyBmaXJzdCBmb3Jcbi8vIFdlYmtpdFRyYW5zZm9ybSA9PiAtd2Via2l0LXRyYW5zZm9ybVxuZnVuY3Rpb24gdG9EYXNoZWRBbGwoIHN0ciApIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKCAvKFtBLVpdKS9nLCBmdW5jdGlvbiggJDEgKSB7XG4gICAgcmV0dXJuICctJyArICQxLnRvTG93ZXJDYXNlKCk7XG4gIH0pO1xufVxuXG52YXIgdHJhbnNpdGlvblByb3BzID0gJ29wYWNpdHksJyArIHRvRGFzaGVkQWxsKCB0cmFuc2Zvcm1Qcm9wZXJ0eSApO1xuXG5wcm90by5lbmFibGVUcmFuc2l0aW9uID0gZnVuY3Rpb24oLyogc3R5bGUgKi8pIHtcbiAgLy8gSEFDSyBjaGFuZ2luZyB0cmFuc2l0aW9uUHJvcGVydHkgZHVyaW5nIGEgdHJhbnNpdGlvblxuICAvLyB3aWxsIGNhdXNlIHRyYW5zaXRpb24gdG8ganVtcFxuICBpZiAoIHRoaXMuaXNUcmFuc2l0aW9uaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIG1ha2UgYHRyYW5zaXRpb246IGZvbywgYmFyLCBiYXpgIGZyb20gc3R5bGUgb2JqZWN0XG4gIC8vIEhBQ0sgdW4tY29tbWVudCB0aGlzIHdoZW4gZW5hYmxlVHJhbnNpdGlvbiBjYW4gd29ya1xuICAvLyB3aGlsZSBhIHRyYW5zaXRpb24gaXMgaGFwcGVuaW5nXG4gIC8vIHZhciB0cmFuc2l0aW9uVmFsdWVzID0gW107XG4gIC8vIGZvciAoIHZhciBwcm9wIGluIHN0eWxlICkge1xuICAvLyAgIC8vIGRhc2gtaWZ5IGNhbWVsQ2FzZWQgcHJvcGVydGllcyBsaWtlIFdlYmtpdFRyYW5zaXRpb25cbiAgLy8gICBwcm9wID0gdmVuZG9yUHJvcGVydGllc1sgcHJvcCBdIHx8IHByb3A7XG4gIC8vICAgdHJhbnNpdGlvblZhbHVlcy5wdXNoKCB0b0Rhc2hlZEFsbCggcHJvcCApICk7XG4gIC8vIH1cbiAgLy8gbXVuZ2UgbnVtYmVyIHRvIG1pbGxpc2Vjb25kLCB0byBtYXRjaCBzdGFnZ2VyXG4gIHZhciBkdXJhdGlvbiA9IHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uO1xuICBkdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PSAnbnVtYmVyJyA/IGR1cmF0aW9uICsgJ21zJyA6IGR1cmF0aW9uO1xuICAvLyBlbmFibGUgdHJhbnNpdGlvbiBzdHlsZXNcbiAgdGhpcy5jc3Moe1xuICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogdHJhbnNpdGlvblByb3BzLFxuICAgIHRyYW5zaXRpb25EdXJhdGlvbjogZHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5OiB0aGlzLnN0YWdnZXJEZWxheSB8fCAwXG4gIH0pO1xuICAvLyBsaXN0ZW4gZm9yIHRyYW5zaXRpb24gZW5kIGV2ZW50XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCB0cmFuc2l0aW9uRW5kRXZlbnQsIHRoaXMsIGZhbHNlICk7XG59O1xuXG4vLyAtLS0tLSBldmVudHMgLS0tLS0gLy9cblxucHJvdG8ub253ZWJraXRUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLm9udHJhbnNpdGlvbmVuZCggZXZlbnQgKTtcbn07XG5cbnByb3RvLm9ub3RyYW5zaXRpb25lbmQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMub250cmFuc2l0aW9uZW5kKCBldmVudCApO1xufTtcblxuLy8gcHJvcGVydGllcyB0aGF0IEkgbXVuZ2UgdG8gbWFrZSBteSBsaWZlIGVhc2llclxudmFyIGRhc2hlZFZlbmRvclByb3BlcnRpZXMgPSB7XG4gICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2Zvcm0nXG59O1xuXG5wcm90by5vbnRyYW5zaXRpb25lbmQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIC8vIGRpc3JlZ2FyZCBidWJibGVkIGV2ZW50cyBmcm9tIGNoaWxkcmVuXG4gIGlmICggZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsZW1lbnQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBfdHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zbjtcbiAgLy8gZ2V0IHByb3BlcnR5IG5hbWUgb2YgdHJhbnNpdGlvbmVkIHByb3BlcnR5LCBjb252ZXJ0IHRvIHByZWZpeC1mcmVlXG4gIHZhciBwcm9wZXJ0eU5hbWUgPSBkYXNoZWRWZW5kb3JQcm9wZXJ0aWVzWyBldmVudC5wcm9wZXJ0eU5hbWUgXSB8fCBldmVudC5wcm9wZXJ0eU5hbWU7XG5cbiAgLy8gcmVtb3ZlIHByb3BlcnR5IHRoYXQgaGFzIGNvbXBsZXRlZCB0cmFuc2l0aW9uaW5nXG4gIGRlbGV0ZSBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzWyBwcm9wZXJ0eU5hbWUgXTtcbiAgLy8gY2hlY2sgaWYgYW55IHByb3BlcnRpZXMgYXJlIHN0aWxsIHRyYW5zaXRpb25pbmdcbiAgaWYgKCBpc0VtcHR5T2JqKCBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzICkgKSB7XG4gICAgLy8gYWxsIHByb3BlcnRpZXMgaGF2ZSBjb21wbGV0ZWQgdHJhbnNpdGlvbmluZ1xuICAgIHRoaXMuZGlzYWJsZVRyYW5zaXRpb24oKTtcbiAgfVxuICAvLyBjbGVhbiBzdHlsZVxuICBpZiAoIHByb3BlcnR5TmFtZSBpbiBfdHJhbnNpdGlvbi5jbGVhbiApIHtcbiAgICAvLyBjbGVhbiB1cCBzdHlsZVxuICAgIHRoaXMuZWxlbWVudC5zdHlsZVsgZXZlbnQucHJvcGVydHlOYW1lIF0gPSAnJztcbiAgICBkZWxldGUgX3RyYW5zaXRpb24uY2xlYW5bIHByb3BlcnR5TmFtZSBdO1xuICB9XG4gIC8vIHRyaWdnZXIgb25UcmFuc2l0aW9uRW5kIGNhbGxiYWNrXG4gIGlmICggcHJvcGVydHlOYW1lIGluIF90cmFuc2l0aW9uLm9uRW5kICkge1xuICAgIHZhciBvblRyYW5zaXRpb25FbmQgPSBfdHJhbnNpdGlvbi5vbkVuZFsgcHJvcGVydHlOYW1lIF07XG4gICAgb25UcmFuc2l0aW9uRW5kLmNhbGwoIHRoaXMgKTtcbiAgICBkZWxldGUgX3RyYW5zaXRpb24ub25FbmRbIHByb3BlcnR5TmFtZSBdO1xuICB9XG5cbiAgdGhpcy5lbWl0RXZlbnQoICd0cmFuc2l0aW9uRW5kJywgWyB0aGlzIF0gKTtcbn07XG5cbnByb3RvLmRpc2FibGVUcmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVtb3ZlVHJhbnNpdGlvblN0eWxlcygpO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHJhbnNpdGlvbkVuZEV2ZW50LCB0aGlzLCBmYWxzZSApO1xuICB0aGlzLmlzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiByZW1vdmVzIHN0eWxlIHByb3BlcnR5IGZyb20gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlXG4qKi9cbnByb3RvLl9yZW1vdmVTdHlsZXMgPSBmdW5jdGlvbiggc3R5bGUgKSB7XG4gIC8vIGNsZWFuIHVwIHRyYW5zaXRpb24gc3R5bGVzXG4gIHZhciBjbGVhblN0eWxlID0ge307XG4gIGZvciAoIHZhciBwcm9wIGluIHN0eWxlICkge1xuICAgIGNsZWFuU3R5bGVbIHByb3AgXSA9ICcnO1xuICB9XG4gIHRoaXMuY3NzKCBjbGVhblN0eWxlICk7XG59O1xuXG52YXIgY2xlYW5UcmFuc2l0aW9uU3R5bGUgPSB7XG4gIHRyYW5zaXRpb25Qcm9wZXJ0eTogJycsXG4gIHRyYW5zaXRpb25EdXJhdGlvbjogJycsXG4gIHRyYW5zaXRpb25EZWxheTogJydcbn07XG5cbnByb3RvLnJlbW92ZVRyYW5zaXRpb25TdHlsZXMgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVtb3ZlIHRyYW5zaXRpb25cbiAgdGhpcy5jc3MoIGNsZWFuVHJhbnNpdGlvblN0eWxlICk7XG59O1xuXG4vLyAtLS0tLSBzdGFnZ2VyIC0tLS0tIC8vXG5cbnByb3RvLnN0YWdnZXIgPSBmdW5jdGlvbiggZGVsYXkgKSB7XG4gIGRlbGF5ID0gaXNOYU4oIGRlbGF5ICkgPyAwIDogZGVsYXk7XG4gIHRoaXMuc3RhZ2dlckRlbGF5ID0gZGVsYXkgKyAnbXMnO1xufTtcblxuLy8gLS0tLS0gc2hvdy9oaWRlL3JlbW92ZSAtLS0tLSAvL1xuXG4vLyByZW1vdmUgZWxlbWVudCBmcm9tIERPTVxucHJvdG8ucmVtb3ZlRWxlbSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG4gIC8vIHJlbW92ZSBkaXNwbGF5OiBub25lXG4gIHRoaXMuY3NzKHsgZGlzcGxheTogJycgfSk7XG4gIHRoaXMuZW1pdEV2ZW50KCAncmVtb3ZlJywgWyB0aGlzIF0gKTtcbn07XG5cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBqdXN0IHJlbW92ZSBlbGVtZW50IGlmIG5vIHRyYW5zaXRpb24gc3VwcG9ydCBvciBubyB0cmFuc2l0aW9uXG4gIGlmICggIXRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAhcGFyc2VGbG9hdCggdGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb24gKSApIHtcbiAgICB0aGlzLnJlbW92ZUVsZW0oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzdGFydCB0cmFuc2l0aW9uXG4gIHRoaXMub25jZSggJ3RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUVsZW0oKTtcbiAgfSk7XG4gIHRoaXMuaGlkZSgpO1xufTtcblxucHJvdG8ucmV2ZWFsID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLmlzSGlkZGVuO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuXG4gIHZhciBvcHRpb25zID0gdGhpcy5sYXlvdXQub3B0aW9ucztcblxuICB2YXIgb25UcmFuc2l0aW9uRW5kID0ge307XG4gIHZhciB0cmFuc2l0aW9uRW5kUHJvcGVydHkgPSB0aGlzLmdldEhpZGVSZXZlYWxUcmFuc2l0aW9uRW5kUHJvcGVydHkoJ3Zpc2libGVTdHlsZScpO1xuICBvblRyYW5zaXRpb25FbmRbIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSBdID0gdGhpcy5vblJldmVhbFRyYW5zaXRpb25FbmQ7XG5cbiAgdGhpcy50cmFuc2l0aW9uKHtcbiAgICBmcm9tOiBvcHRpb25zLmhpZGRlblN0eWxlLFxuICAgIHRvOiBvcHRpb25zLnZpc2libGVTdHlsZSxcbiAgICBpc0NsZWFuaW5nOiB0cnVlLFxuICAgIG9uVHJhbnNpdGlvbkVuZDogb25UcmFuc2l0aW9uRW5kXG4gIH0pO1xufTtcblxucHJvdG8ub25SZXZlYWxUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNoZWNrIGlmIHN0aWxsIHZpc2libGVcbiAgLy8gZHVyaW5nIHRyYW5zaXRpb24sIGl0ZW0gbWF5IGhhdmUgYmVlbiBoaWRkZW5cbiAgaWYgKCAhdGhpcy5pc0hpZGRlbiApIHtcbiAgICB0aGlzLmVtaXRFdmVudCgncmV2ZWFsJyk7XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IHN0eWxlIHByb3BlcnR5IHVzZSBmb3IgaGlkZS9yZXZlYWwgdHJhbnNpdGlvbiBlbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZVByb3BlcnR5IC0gaGlkZGVuU3R5bGUvdmlzaWJsZVN0eWxlXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5wcm90by5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gZnVuY3Rpb24oIHN0eWxlUHJvcGVydHkgKSB7XG4gIHZhciBvcHRpb25TdHlsZSA9IHRoaXMubGF5b3V0Lm9wdGlvbnNbIHN0eWxlUHJvcGVydHkgXTtcbiAgLy8gdXNlIG9wYWNpdHlcbiAgaWYgKCBvcHRpb25TdHlsZS5vcGFjaXR5ICkge1xuICAgIHJldHVybiAnb3BhY2l0eSc7XG4gIH1cbiAgLy8gZ2V0IGZpcnN0IHByb3BlcnR5XG4gIGZvciAoIHZhciBwcm9wIGluIG9wdGlvblN0eWxlICkge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG59O1xuXG5wcm90by5oaWRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHNldCBmbGFnXG4gIHRoaXMuaXNIaWRkZW4gPSB0cnVlO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuXG4gIHZhciBvcHRpb25zID0gdGhpcy5sYXlvdXQub3B0aW9ucztcblxuICB2YXIgb25UcmFuc2l0aW9uRW5kID0ge307XG4gIHZhciB0cmFuc2l0aW9uRW5kUHJvcGVydHkgPSB0aGlzLmdldEhpZGVSZXZlYWxUcmFuc2l0aW9uRW5kUHJvcGVydHkoJ2hpZGRlblN0eWxlJyk7XG4gIG9uVHJhbnNpdGlvbkVuZFsgdHJhbnNpdGlvbkVuZFByb3BlcnR5IF0gPSB0aGlzLm9uSGlkZVRyYW5zaXRpb25FbmQ7XG5cbiAgdGhpcy50cmFuc2l0aW9uKHtcbiAgICBmcm9tOiBvcHRpb25zLnZpc2libGVTdHlsZSxcbiAgICB0bzogb3B0aW9ucy5oaWRkZW5TdHlsZSxcbiAgICAvLyBrZWVwIGhpZGRlbiBzdHVmZiBoaWRkZW5cbiAgICBpc0NsZWFuaW5nOiB0cnVlLFxuICAgIG9uVHJhbnNpdGlvbkVuZDogb25UcmFuc2l0aW9uRW5kXG4gIH0pO1xufTtcblxucHJvdG8ub25IaWRlVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBpZiBzdGlsbCBoaWRkZW5cbiAgLy8gZHVyaW5nIHRyYW5zaXRpb24sIGl0ZW0gbWF5IGhhdmUgYmVlbiB1bi1oaWRkZW5cbiAgaWYgKCB0aGlzLmlzSGlkZGVuICkge1xuICAgIHRoaXMuY3NzKHsgZGlzcGxheTogJ25vbmUnIH0pO1xuICAgIHRoaXMuZW1pdEV2ZW50KCdoaWRlJyk7XG4gIH1cbn07XG5cbnByb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jc3Moe1xuICAgIHBvc2l0aW9uOiAnJyxcbiAgICBsZWZ0OiAnJyxcbiAgICByaWdodDogJycsXG4gICAgdG9wOiAnJyxcbiAgICBib3R0b206ICcnLFxuICAgIHRyYW5zaXRpb246ICcnLFxuICAgIHRyYW5zZm9ybTogJydcbiAgfSk7XG59O1xuXG5yZXR1cm4gSXRlbTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FDQTtBQUFBO0FBQUE7QUFBQSxrR0FDQTtBQUNBLFdBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/outlayer/item.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/outlayer/outlayer.js":
+/*!*******************************************!*\
+ !*** ./node_modules/outlayer/outlayer.js ***!
+ \*******************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Outlayer v2.1.1\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\"),\n __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\"),\n __webpack_require__(/*! ./item */ \"./node_modules/outlayer/item.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvb3V0bGF5ZXIvb3V0bGF5ZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL291dGxheWVyL291dGxheWVyLmpzPzFmMmUiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBPdXRsYXllciB2Mi4xLjFcbiAqIHRoZSBicmFpbnMgYW5kIGd1dHMgb2YgYSBsYXlvdXQgbGlicmFyeVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTUQgLSBSZXF1aXJlSlNcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcicsXG4gICAgICAgICdnZXQtc2l6ZS9nZXQtc2l6ZScsXG4gICAgICAgICdmaXp6eS11aS11dGlscy91dGlscycsXG4gICAgICAgICcuL2l0ZW0nXG4gICAgICBdLFxuICAgICAgZnVuY3Rpb24oIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0gKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0pO1xuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKSxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJyksXG4gICAgICByZXF1aXJlKCcuL2l0ZW0nKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuT3V0bGF5ZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgIHdpbmRvdy5nZXRTaXplLFxuICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICAgIHdpbmRvdy5PdXRsYXllci5JdGVtXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgSXRlbSApIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gdmFycyAtLS0tLSAvL1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xudmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE91dGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xudmFyIEdVSUQgPSAwO1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIE91dGxheWVyIGludGFuY2VzXG52YXIgaW5zdGFuY2VzID0ge307XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQsIFN0cmluZ30gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBPdXRsYXllciggZWxlbWVudCwgb3B0aW9ucyApIHtcbiAgdmFyIHF1ZXJ5RWxlbWVudCA9IHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggZWxlbWVudCApO1xuICBpZiAoICFxdWVyeUVsZW1lbnQgKSB7XG4gICAgaWYgKCBjb25zb2xlICkge1xuICAgICAgY29uc29sZS5lcnJvciggJ0JhZCBlbGVtZW50IGZvciAnICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lc3BhY2UgK1xuICAgICAgICAnOiAnICsgKCBxdWVyeUVsZW1lbnQgfHwgZWxlbWVudCApICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQgPSBxdWVyeUVsZW1lbnQ7XG4gIC8vIGFkZCBqUXVlcnlcbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGpRdWVyeSggdGhpcy5lbGVtZW50ICk7XG4gIH1cblxuICAvLyBvcHRpb25zXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIHRoaXMuY29uc3RydWN0b3IuZGVmYXVsdHMgKTtcbiAgdGhpcy5vcHRpb24oIG9wdGlvbnMgKTtcblxuICAvLyBhZGQgaWQgZm9yIE91dGxheWVyLmdldEZyb21FbGVtZW50XG4gIHZhciBpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcblxuICAvLyBraWNrIGl0IG9mZlxuICB0aGlzLl9jcmVhdGUoKTtcblxuICB2YXIgaXNJbml0TGF5b3V0ID0gdGhpcy5fZ2V0T3B0aW9uKCdpbml0TGF5b3V0Jyk7XG4gIGlmICggaXNJbml0TGF5b3V0ICkge1xuICAgIHRoaXMubGF5b3V0KCk7XG4gIH1cbn1cblxuLy8gc2V0dGluZ3MgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seVxuT3V0bGF5ZXIubmFtZXNwYWNlID0gJ291dGxheWVyJztcbk91dGxheWVyLkl0ZW0gPSBJdGVtO1xuXG4vLyBkZWZhdWx0IG9wdGlvbnNcbk91dGxheWVyLmRlZmF1bHRzID0ge1xuICBjb250YWluZXJTdHlsZToge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gIH0sXG4gIGluaXRMYXlvdXQ6IHRydWUsXG4gIG9yaWdpbkxlZnQ6IHRydWUsXG4gIG9yaWdpblRvcDogdHJ1ZSxcbiAgcmVzaXplOiB0cnVlLFxuICByZXNpemVDb250YWluZXI6IHRydWUsXG4gIC8vIGl0ZW0gb3B0aW9uc1xuICB0cmFuc2l0aW9uRHVyYXRpb246ICcwLjRzJyxcbiAgaGlkZGVuU3R5bGU6IHtcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMDAxKSdcbiAgfSxcbiAgdmlzaWJsZVN0eWxlOiB7XG4gICAgb3BhY2l0eTogMSxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfVxufTtcblxudmFyIHByb3RvID0gT3V0bGF5ZXIucHJvdG90eXBlO1xuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnV0aWxzLmV4dGVuZCggcHJvdG8sIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxuLyoqXG4gKiBzZXQgb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xucHJvdG8ub3B0aW9uID0gZnVuY3Rpb24oIG9wdHMgKSB7XG4gIHV0aWxzLmV4dGVuZCggdGhpcy5vcHRpb25zLCBvcHRzICk7XG59O1xuXG4vKipcbiAqIGdldCBiYWNrd2FyZHMgY29tcGF0aWJsZSBvcHRpb24gdmFsdWUsIGNoZWNrIG9sZCBuYW1lXG4gKi9cbnByb3RvLl9nZXRPcHRpb24gPSBmdW5jdGlvbiggb3B0aW9uICkge1xuICB2YXIgb2xkT3B0aW9uID0gdGhpcy5jb25zdHJ1Y3Rvci5jb21wYXRPcHRpb25zWyBvcHRpb24gXTtcbiAgcmV0dXJuIG9sZE9wdGlvbiAmJiB0aGlzLm9wdGlvbnNbIG9sZE9wdGlvbiBdICE9PSB1bmRlZmluZWQgP1xuICAgIHRoaXMub3B0aW9uc1sgb2xkT3B0aW9uIF0gOiB0aGlzLm9wdGlvbnNbIG9wdGlvbiBdO1xufTtcblxuT3V0bGF5ZXIuY29tcGF0T3B0aW9ucyA9IHtcbiAgLy8gY3VycmVudE5hbWU6IG9sZE5hbWVcbiAgaW5pdExheW91dDogJ2lzSW5pdExheW91dCcsXG4gIGhvcml6b250YWw6ICdpc0hvcml6b250YWwnLFxuICBsYXlvdXRJbnN0YW50OiAnaXNMYXlvdXRJbnN0YW50JyxcbiAgb3JpZ2luTGVmdDogJ2lzT3JpZ2luTGVmdCcsXG4gIG9yaWdpblRvcDogJ2lzT3JpZ2luVG9wJyxcbiAgcmVzaXplOiAnaXNSZXNpemVCb3VuZCcsXG4gIHJlc2l6ZUNvbnRhaW5lcjogJ2lzUmVzaXppbmdDb250YWluZXInXG59O1xuXG5wcm90by5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGdldCBpdGVtcyBmcm9tIGNoaWxkcmVuXG4gIHRoaXMucmVsb2FkSXRlbXMoKTtcbiAgLy8gZWxlbWVudHMgdGhhdCBhZmZlY3QgbGF5b3V0LCBidXQgYXJlIG5vdCBsYWlkIG91dFxuICB0aGlzLnN0YW1wcyA9IFtdO1xuICB0aGlzLnN0YW1wKCB0aGlzLm9wdGlvbnMuc3RhbXAgKTtcbiAgLy8gc2V0IGNvbnRhaW5lciBzdHlsZVxuICB1dGlscy5leHRlbmQoIHRoaXMuZWxlbWVudC5zdHlsZSwgdGhpcy5vcHRpb25zLmNvbnRhaW5lclN0eWxlICk7XG5cbiAgLy8gYmluZCByZXNpemUgbWV0aG9kXG4gIHZhciBjYW5CaW5kUmVzaXplID0gdGhpcy5fZ2V0T3B0aW9uKCdyZXNpemUnKTtcbiAgaWYgKCBjYW5CaW5kUmVzaXplICkge1xuICAgIHRoaXMuYmluZFJlc2l6ZSgpO1xuICB9XG59O1xuXG4vLyBnb2VzIHRocm91Z2ggYWxsIGNoaWxkcmVuIGFnYWluIGFuZCBnZXRzIGJyaWNrcyBpbiBwcm9wZXIgb3JkZXJcbnByb3RvLnJlbG9hZEl0ZW1zID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICB0aGlzLml0ZW1zID0gdGhpcy5faXRlbWl6ZSggdGhpcy5lbGVtZW50LmNoaWxkcmVuICk7XG59O1xuXG5cbi8qKlxuICogdHVybiBlbGVtZW50cyBpbnRvIE91dGxheWVyLkl0ZW1zIHRvIGJlIHVzZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IE91dGxheWVyIEl0ZW1zXG4gKi9cbnByb3RvLl9pdGVtaXplID0gZnVuY3Rpb24oIGVsZW1zICkge1xuXG4gIHZhciBpdGVtRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzKCBlbGVtcyApO1xuICB2YXIgSXRlbSA9IHRoaXMuY29uc3RydWN0b3IuSXRlbTtcblxuICAvLyBjcmVhdGUgbmV3IE91dGxheWVyIEl0ZW1zIGZvciBjb2xsZWN0aW9uXG4gIHZhciBpdGVtcyA9IFtdO1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgaXRlbUVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBlbGVtID0gaXRlbUVsZW1zW2ldO1xuICAgIHZhciBpdGVtID0gbmV3IEl0ZW0oIGVsZW0sIHRoaXMgKTtcbiAgICBpdGVtcy5wdXNoKCBpdGVtICk7XG4gIH1cblxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIGdldCBpdGVtIGVsZW1lbnRzIHRvIGJlIHVzZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGl0ZW0gZWxlbWVudHNcbiAqL1xucHJvdG8uX2ZpbHRlckZpbmRJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHJldHVybiB1dGlscy5maWx0ZXJGaW5kRWxlbWVudHMoIGVsZW1zLCB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yICk7XG59O1xuXG4vKipcbiAqIGdldHRlciBtZXRob2QgZm9yIGdldHRpbmcgaXRlbSBlbGVtZW50c1xuICogQHJldHVybnMge0FycmF5fSBlbGVtcyAtIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICovXG5wcm90by5nZXRJdGVtRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICByZXR1cm4gaXRlbS5lbGVtZW50O1xuICB9KTtcbn07XG5cbi8vIC0tLS0tIGluaXQgJiBsYXlvdXQgLS0tLS0gLy9cblxuLyoqXG4gKiBsYXlzIG91dCBhbGwgaXRlbXNcbiAqL1xucHJvdG8ubGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3Jlc2V0TGF5b3V0KCk7XG4gIHRoaXMuX21hbmFnZVN0YW1wcygpO1xuXG4gIC8vIGRvbid0IGFuaW1hdGUgZmlyc3QgbGF5b3V0XG4gIHZhciBsYXlvdXRJbnN0YW50ID0gdGhpcy5fZ2V0T3B0aW9uKCdsYXlvdXRJbnN0YW50Jyk7XG4gIHZhciBpc0luc3RhbnQgPSBsYXlvdXRJbnN0YW50ICE9PSB1bmRlZmluZWQgP1xuICAgIGxheW91dEluc3RhbnQgOiAhdGhpcy5faXNMYXlvdXRJbml0ZWQ7XG4gIHRoaXMubGF5b3V0SXRlbXMoIHRoaXMuaXRlbXMsIGlzSW5zdGFudCApO1xuXG4gIC8vIGZsYWcgZm9yIGluaXRhbGl6ZWRcbiAgdGhpcy5faXNMYXlvdXRJbml0ZWQgPSB0cnVlO1xufTtcblxuLy8gX2luaXQgaXMgYWxpYXMgZm9yIGxheW91dFxucHJvdG8uX2luaXQgPSBwcm90by5sYXlvdXQ7XG5cbi8qKlxuICogbG9naWMgYmVmb3JlIGFueSBuZXcgbGF5b3V0XG4gKi9cbnByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldFNpemUoKTtcbn07XG5cblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbi8qKlxuICogZ2V0IG1lYXN1cmVtZW50IGZyb20gb3B0aW9uLCBmb3IgY29sdW1uV2lkdGgsIHJvd0hlaWdodCwgZ3V0dGVyXG4gKiBpZiBvcHRpb24gaXMgU3RyaW5nIC0+IGdldCBlbGVtZW50IGZyb20gc2VsZWN0b3Igc3RyaW5nLCAmIGdldCBzaXplIG9mIGVsZW1lbnRcbiAqIGlmIG9wdGlvbiBpcyBFbGVtZW50IC0+IGdldCBzaXplIG9mIGVsZW1lbnRcbiAqIGVsc2UgdXNlIG9wdGlvbiBhcyBhIG51bWJlclxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZWFzdXJlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNpemUgLSB3aWR0aCBvciBoZWlnaHRcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9nZXRNZWFzdXJlbWVudCA9IGZ1bmN0aW9uKCBtZWFzdXJlbWVudCwgc2l6ZSApIHtcbiAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1sgbWVhc3VyZW1lbnQgXTtcbiAgdmFyIGVsZW07XG4gIGlmICggIW9wdGlvbiApIHtcbiAgICAvLyBkZWZhdWx0IHRvIDBcbiAgICB0aGlzWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyB1c2Ugb3B0aW9uIGFzIGFuIGVsZW1lbnRcbiAgICBpZiAoIHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgKSB7XG4gICAgICBlbGVtID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIG9wdGlvbiApO1xuICAgIH0gZWxzZSBpZiAoIG9wdGlvbiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICkge1xuICAgICAgZWxlbSA9IG9wdGlvbjtcbiAgICB9XG4gICAgLy8gdXNlIHNpemUgb2YgZWxlbWVudCwgaWYgZWxlbWVudFxuICAgIHRoaXNbIG1lYXN1cmVtZW50IF0gPSBlbGVtID8gZ2V0U2l6ZSggZWxlbSApWyBzaXplIF0gOiBvcHRpb247XG4gIH1cbn07XG5cbi8qKlxuICogbGF5b3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtIGVsZW1lbnRzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5wcm90by5sYXlvdXRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgaXNJbnN0YW50ICkge1xuICBpdGVtcyA9IHRoaXMuX2dldEl0ZW1zRm9yTGF5b3V0KCBpdGVtcyApO1xuXG4gIHRoaXMuX2xheW91dEl0ZW1zKCBpdGVtcywgaXNJbnN0YW50ICk7XG5cbiAgdGhpcy5fcG9zdExheW91dCgpO1xufTtcblxuLyoqXG4gKiBnZXQgdGhlIGl0ZW1zIHRvIGJlIGxhaWQgb3V0XG4gKiB5b3UgbWF5IHdhbnQgdG8gc2tpcCBvdmVyIHNvbWUgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zXG4gKi9cbnByb3RvLl9nZXRJdGVtc0ZvckxheW91dCA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgcmV0dXJuIGl0ZW1zLmZpbHRlciggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgcmV0dXJuICFpdGVtLmlzSWdub3JlZDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGxheW91dCBpdGVtc1xuICogQHBhcmFtIHtBcnJheX0gaXRlbXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50XG4gKi9cbnByb3RvLl9sYXlvdXRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgaXNJbnN0YW50ICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAnbGF5b3V0JywgaXRlbXMgKTtcblxuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIC8vIG5vIGl0ZW1zLCBlbWl0IGV2ZW50IHdpdGggZW1wdHkgYXJyYXlcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBbXTtcblxuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICAvLyBnZXQgeC95IG9iamVjdCBmcm9tIG1ldGhvZFxuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiggaXRlbSApO1xuICAgIC8vIGVucXVldWVcbiAgICBwb3NpdGlvbi5pdGVtID0gaXRlbTtcbiAgICBwb3NpdGlvbi5pc0luc3RhbnQgPSBpc0luc3RhbnQgfHwgaXRlbS5pc0xheW91dEluc3RhbnQ7XG4gICAgcXVldWUucHVzaCggcG9zaXRpb24gKTtcbiAgfSwgdGhpcyApO1xuXG4gIHRoaXMuX3Byb2Nlc3NMYXlvdXRRdWV1ZSggcXVldWUgKTtcbn07XG5cbi8qKlxuICogZ2V0IGl0ZW0gbGF5b3V0IHBvc2l0aW9uXG4gKiBAcGFyYW0ge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqIEByZXR1cm5zIHtPYmplY3R9IHggYW5kIHkgcG9zaXRpb25cbiAqL1xucHJvdG8uX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCAvKiBpdGVtICovICkge1xuICByZXR1cm4ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuLyoqXG4gKiBpdGVyYXRlIG92ZXIgYXJyYXkgYW5kIHBvc2l0aW9uIGVhY2ggaXRlbVxuICogUmVhc29uIGJlaW5nIC0gc2VwYXJhdGluZyB0aGlzIGxvZ2ljIHByZXZlbnRzICdsYXlvdXQgaW52YWxpZGF0aW9uJ1xuICogdGh4IEBwYXVsX2lyaXNoXG4gKiBAcGFyYW0ge0FycmF5fSBxdWV1ZVxuICovXG5wcm90by5fcHJvY2Vzc0xheW91dFF1ZXVlID0gZnVuY3Rpb24oIHF1ZXVlICkge1xuICB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgcXVldWUuZm9yRWFjaCggZnVuY3Rpb24oIG9iaiwgaSApIHtcbiAgICB0aGlzLl9wb3NpdGlvbkl0ZW0oIG9iai5pdGVtLCBvYmoueCwgb2JqLnksIG9iai5pc0luc3RhbnQsIGkgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuLy8gc2V0IHN0YWdnZXIgZnJvbSBvcHRpb24gaW4gbWlsbGlzZWNvbmRzIG51bWJlclxucHJvdG8udXBkYXRlU3RhZ2dlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhZ2dlciA9IHRoaXMub3B0aW9ucy5zdGFnZ2VyO1xuICBpZiAoIHN0YWdnZXIgPT09IG51bGwgfHwgc3RhZ2dlciA9PT0gdW5kZWZpbmVkICkge1xuICAgIHRoaXMuc3RhZ2dlciA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc3RhZ2dlciA9IGdldE1pbGxpc2Vjb25kcyggc3RhZ2dlciApO1xuICByZXR1cm4gdGhpcy5zdGFnZ2VyO1xufTtcblxuLyoqXG4gKiBTZXRzIHBvc2l0aW9uIG9mIGl0ZW0gaW4gRE9NXG4gKiBAcGFyYW0ge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gaG9yaXpvbnRhbCBwb3NpdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHkgLSB2ZXJ0aWNhbCBwb3NpdGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpc0luc3RhbnQgLSBkaXNhYmxlcyB0cmFuc2l0aW9uc1xuICovXG5wcm90by5fcG9zaXRpb25JdGVtID0gZnVuY3Rpb24oIGl0ZW0sIHgsIHksIGlzSW5zdGFudCwgaSApIHtcbiAgaWYgKCBpc0luc3RhbnQgKSB7XG4gICAgLy8gaWYgbm90IHRyYW5zaXRpb24sIGp1c3Qgc2V0IENTU1xuICAgIGl0ZW0uZ29UbyggeCwgeSApO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHRoaXMuc3RhZ2dlciApO1xuICAgIGl0ZW0ubW92ZVRvKCB4LCB5ICk7XG4gIH1cbn07XG5cbi8qKlxuICogQW55IGxvZ2ljIHlvdSB3YW50IHRvIGRvIGFmdGVyIGVhY2ggbGF5b3V0LFxuICogaS5lLiBzaXplIHRoZSBjb250YWluZXJcbiAqL1xucHJvdG8uX3Bvc3RMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZXNpemVDb250YWluZXIoKTtcbn07XG5cbnByb3RvLnJlc2l6ZUNvbnRhaW5lciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXNSZXNpemluZ0NvbnRhaW5lciA9IHRoaXMuX2dldE9wdGlvbigncmVzaXplQ29udGFpbmVyJyk7XG4gIGlmICggIWlzUmVzaXppbmdDb250YWluZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzaXplID0gdGhpcy5fZ2V0Q29udGFpbmVyU2l6ZSgpO1xuICBpZiAoIHNpemUgKSB7XG4gICAgdGhpcy5fc2V0Q29udGFpbmVyTWVhc3VyZSggc2l6ZS53aWR0aCwgdHJ1ZSApO1xuICAgIHRoaXMuX3NldENvbnRhaW5lck1lYXN1cmUoIHNpemUuaGVpZ2h0LCBmYWxzZSApO1xuICB9XG59O1xuXG4vKipcbiAqIFNldHMgd2lkdGggb3IgaGVpZ2h0IG9mIGNvbnRhaW5lciBpZiByZXR1cm5lZFxuICogQHJldHVybnMge09iamVjdH0gc2l6ZVxuICogICBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqICAgQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICovXG5wcm90by5fZ2V0Q29udGFpbmVyU2l6ZSA9IG5vb3A7XG5cbi8qKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1lYXN1cmUgLSBzaXplIG9mIHdpZHRoIG9yIGhlaWdodFxuICogQHBhcmFtIHtCb29sZWFufSBpc1dpZHRoXG4gKi9cbnByb3RvLl9zZXRDb250YWluZXJNZWFzdXJlID0gZnVuY3Rpb24oIG1lYXN1cmUsIGlzV2lkdGggKSB7XG4gIGlmICggbWVhc3VyZSA9PT0gdW5kZWZpbmVkICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBlbGVtU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB3aWR0aCBpZiBib3JkZXIgYm94XG4gIGlmICggZWxlbVNpemUuaXNCb3JkZXJCb3ggKSB7XG4gICAgbWVhc3VyZSArPSBpc1dpZHRoID8gZWxlbVNpemUucGFkZGluZ0xlZnQgKyBlbGVtU2l6ZS5wYWRkaW5nUmlnaHQgK1xuICAgICAgZWxlbVNpemUuYm9yZGVyTGVmdFdpZHRoICsgZWxlbVNpemUuYm9yZGVyUmlnaHRXaWR0aCA6XG4gICAgICBlbGVtU2l6ZS5wYWRkaW5nQm90dG9tICsgZWxlbVNpemUucGFkZGluZ1RvcCArXG4gICAgICBlbGVtU2l6ZS5ib3JkZXJUb3BXaWR0aCArIGVsZW1TaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuICB9XG5cbiAgbWVhc3VyZSA9IE1hdGgubWF4KCBtZWFzdXJlLCAwICk7XG4gIHRoaXMuZWxlbWVudC5zdHlsZVsgaXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0JyBdID0gbWVhc3VyZSArICdweCc7XG59O1xuXG4vKipcbiAqIGVtaXQgZXZlbnRDb21wbGV0ZSBvbiBhIGNvbGxlY3Rpb24gb2YgaXRlbXMgZXZlbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4gKi9cbnByb3RvLl9lbWl0Q29tcGxldGVPbkl0ZW1zID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgaXRlbXMgKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGZ1bmN0aW9uIG9uQ29tcGxldGUoKSB7XG4gICAgX3RoaXMuZGlzcGF0Y2hFdmVudCggZXZlbnROYW1lICsgJ0NvbXBsZXRlJywgbnVsbCwgWyBpdGVtcyBdICk7XG4gIH1cblxuICB2YXIgY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gIGlmICggIWl0ZW1zIHx8ICFjb3VudCApIHtcbiAgICBvbkNvbXBsZXRlKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRvbmVDb3VudCA9IDA7XG4gIGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgZG9uZUNvdW50Kys7XG4gICAgaWYgKCBkb25lQ291bnQgPT0gY291bnQgKSB7XG4gICAgICBvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYmluZCBjYWxsYmFja1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLm9uY2UoIGV2ZW50TmFtZSwgdGljayApO1xuICB9KTtcbn07XG5cbi8qKlxuICogZW1pdHMgZXZlbnRzIHZpYSBFdkVtaXR0ZXIgYW5kIGpRdWVyeSBldmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBvcmlnaW5hbCBldmVudFxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGV4dHJhIGFyZ3VtZW50c1xuICovXG5wcm90by5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBhcmdzICkge1xuICAvLyBhZGQgb3JpZ2luYWwgZXZlbnQgdG8gYXJndW1lbnRzXG4gIHZhciBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG5cbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgLy8gc2V0IHRoaXMuJGVsZW1lbnRcbiAgICB0aGlzLiRlbGVtZW50ID0gdGhpcy4kZWxlbWVudCB8fCBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICAgIGlmICggZXZlbnQgKSB7XG4gICAgICAvLyBjcmVhdGUgalF1ZXJ5IGV2ZW50XG4gICAgICB2YXIgJGV2ZW50ID0galF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgJGV2ZW50LnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCAkZXZlbnQsIGFyZ3MgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCB0cmlnZ2VyIHdpdGggdHlwZSBpZiBubyBldmVudCBhdmFpbGFibGVcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggdHlwZSwgYXJncyApO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaWdub3JlICYgc3RhbXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblxuLyoqXG4gKiBrZWVwIGl0ZW0gaW4gY29sbGVjdGlvbiwgYnV0IGRvIG5vdCBsYXkgaXQgb3V0XG4gKiBpZ25vcmVkIGl0ZW1zIGRvIG5vdCBnZXQgc2tpcHBlZCBpbiBsYXlvdXRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICovXG5wcm90by5pZ25vcmUgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgaWYgKCBpdGVtICkge1xuICAgIGl0ZW0uaXNJZ25vcmVkID0gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiByZXR1cm4gaXRlbSB0byBsYXlvdXQgY29sbGVjdGlvblxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKi9cbnByb3RvLnVuaWdub3JlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gIGlmICggaXRlbSApIHtcbiAgICBkZWxldGUgaXRlbS5pc0lnbm9yZWQ7XG4gIH1cbn07XG5cbi8qKlxuICogYWRkcyBlbGVtZW50cyB0byBzdGFtcHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBFbGVtZW50LCBvciBTdHJpbmd9IGVsZW1zXG4gKi9cbnByb3RvLnN0YW1wID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHRoaXMuX2ZpbmQoIGVsZW1zICk7XG4gIGlmICggIWVsZW1zICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuc3RhbXBzID0gdGhpcy5zdGFtcHMuY29uY2F0KCBlbGVtcyApO1xuICAvLyBpZ25vcmVcbiAgZWxlbXMuZm9yRWFjaCggdGhpcy5pZ25vcmUsIHRoaXMgKTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBlbGVtZW50cyB0byBzdGFtcHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by51bnN0YW1wID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHRoaXMuX2ZpbmQoIGVsZW1zICk7XG4gIGlmICggIWVsZW1zICl7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gZmlsdGVyIG91dCByZW1vdmVkIHN0YW1wIGVsZW1lbnRzXG4gICAgdXRpbHMucmVtb3ZlRnJvbSggdGhpcy5zdGFtcHMsIGVsZW0gKTtcbiAgICB0aGlzLnVuaWdub3JlKCBlbGVtICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8qKlxuICogZmluZHMgY2hpbGQgZWxlbWVudHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBFbGVtZW50LCBvciBTdHJpbmd9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGVsZW1zXG4gKi9cbnByb3RvLl9maW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBpZiAoICFlbGVtcyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gaWYgc3RyaW5nLCB1c2UgYXJndW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW1zID09ICdzdHJpbmcnICkge1xuICAgIGVsZW1zID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGVsZW1zICk7XG4gIH1cbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHJldHVybiBlbGVtcztcbn07XG5cbnByb3RvLl9tYW5hZ2VTdGFtcHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5zdGFtcHMgfHwgIXRoaXMuc3RhbXBzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9nZXRCb3VuZGluZ1JlY3QoKTtcblxuICB0aGlzLnN0YW1wcy5mb3JFYWNoKCB0aGlzLl9tYW5hZ2VTdGFtcCwgdGhpcyApO1xufTtcblxuLy8gdXBkYXRlIGJvdW5kaW5nTGVmdCAvIFRvcFxucHJvdG8uX2dldEJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uKCkge1xuICAvLyBnZXQgYm91bmRpbmcgcmVjdCBmb3IgY29udGFpbmVyIGVsZW1lbnRcbiAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gIHRoaXMuX2JvdW5kaW5nUmVjdCA9IHtcbiAgICBsZWZ0OiBib3VuZGluZ1JlY3QubGVmdCArIHNpemUucGFkZGluZ0xlZnQgKyBzaXplLmJvcmRlckxlZnRXaWR0aCxcbiAgICB0b3A6IGJvdW5kaW5nUmVjdC50b3AgKyBzaXplLnBhZGRpbmdUb3AgKyBzaXplLmJvcmRlclRvcFdpZHRoLFxuICAgIHJpZ2h0OiBib3VuZGluZ1JlY3QucmlnaHQgLSAoIHNpemUucGFkZGluZ1JpZ2h0ICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoICksXG4gICAgYm90dG9tOiBib3VuZGluZ1JlY3QuYm90dG9tIC0gKCBzaXplLnBhZGRpbmdCb3R0b20gKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoIClcbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBzdGFtcFxuKiovXG5wcm90by5fbWFuYWdlU3RhbXAgPSBub29wO1xuXG4vKipcbiAqIGdldCB4L3kgcG9zaXRpb24gb2YgZWxlbWVudCByZWxhdGl2ZSB0byBjb250YWluZXIgZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBvZmZzZXQgLSBoYXMgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXG4gKi9cbnByb3RvLl9nZXRFbGVtZW50T2Zmc2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBib3VuZGluZ1JlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgdGhpc1JlY3QgPSB0aGlzLl9ib3VuZGluZ1JlY3Q7XG4gIHZhciBzaXplID0gZ2V0U2l6ZSggZWxlbSApO1xuICB2YXIgb2Zmc2V0ID0ge1xuICAgIGxlZnQ6IGJvdW5kaW5nUmVjdC5sZWZ0IC0gdGhpc1JlY3QubGVmdCAtIHNpemUubWFyZ2luTGVmdCxcbiAgICB0b3A6IGJvdW5kaW5nUmVjdC50b3AgLSB0aGlzUmVjdC50b3AgLSBzaXplLm1hcmdpblRvcCxcbiAgICByaWdodDogdGhpc1JlY3QucmlnaHQgLSBib3VuZGluZ1JlY3QucmlnaHQgLSBzaXplLm1hcmdpblJpZ2h0LFxuICAgIGJvdHRvbTogdGhpc1JlY3QuYm90dG9tIC0gYm91bmRpbmdSZWN0LmJvdHRvbSAtIHNpemUubWFyZ2luQm90dG9tXG4gIH07XG4gIHJldHVybiBvZmZzZXQ7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZW5hYmxlIGV2ZW50IGhhbmRsZXJzIGZvciBsaXN0ZW5lcnNcbi8vIGkuZS4gcmVzaXplIC0+IG9ucmVzaXplXG5wcm90by5oYW5kbGVFdmVudCA9IHV0aWxzLmhhbmRsZUV2ZW50O1xuXG4vKipcbiAqIEJpbmQgbGF5b3V0IHRvIHdpbmRvdyByZXNpemluZ1xuICovXG5wcm90by5iaW5kUmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB0aGlzLmlzUmVzaXplQm91bmQgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBVbmJpbmQgbGF5b3V0IHRvIHdpbmRvdyByZXNpemluZ1xuICovXG5wcm90by51bmJpbmRSZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzICk7XG4gIHRoaXMuaXNSZXNpemVCb3VuZCA9IGZhbHNlO1xufTtcblxucHJvdG8ub25yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZXNpemUoKTtcbn07XG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kKCBPdXRsYXllciwgJ29ucmVzaXplJywgMTAwICk7XG5cbnByb3RvLnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBkb24ndCB0cmlnZ2VyIGlmIHNpemUgZGlkIG5vdCBjaGFuZ2VcbiAgLy8gb3IgaWYgcmVzaXplIHdhcyB1bmJvdW5kLiBTZWUgIzlcbiAgaWYgKCAhdGhpcy5pc1Jlc2l6ZUJvdW5kIHx8ICF0aGlzLm5lZWRzUmVzaXplTGF5b3V0KCkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5sYXlvdXQoKTtcbn07XG5cbi8qKlxuICogY2hlY2sgaWYgbGF5b3V0IGlzIG5lZWRlZCBwb3N0IGxheW91dFxuICogQHJldHVybnMgQm9vbGVhblxuICovXG5wcm90by5uZWVkc1Jlc2l6ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xuICAvLyBjaGVjayB0aGF0IHRoaXMuc2l6ZSBhbmQgc2l6ZSBhcmUgdGhlcmVcbiAgLy8gSUU4IHRyaWdnZXJzIHJlc2l6ZSBvbiBib2R5IHNpemUgY2hhbmdlLCBzbyB0aGV5IG1pZ2h0IG5vdCBiZVxuICB2YXIgaGFzU2l6ZXMgPSB0aGlzLnNpemUgJiYgc2l6ZTtcbiAgcmV0dXJuIGhhc1NpemVzICYmIHNpemUuaW5uZXJXaWR0aCAhPT0gdGhpcy5zaXplLmlubmVyV2lkdGg7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogYWRkIGl0ZW1zIHRvIE91dGxheWVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbioqL1xucHJvdG8uYWRkSXRlbXMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1pemUoIGVsZW1zICk7XG4gIC8vIGFkZCBpdGVtcyB0byBjb2xsZWN0aW9uXG4gIGlmICggaXRlbXMubGVuZ3RoICkge1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmNvbmNhdCggaXRlbXMgKTtcbiAgfVxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIExheW91dCBuZXdseS1hcHBlbmRlZCBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLmFwcGVuZGVkID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmFkZEl0ZW1zKCBlbGVtcyApO1xuICBpZiAoICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGxheW91dCBhbmQgcmV2ZWFsIGp1c3QgdGhlIG5ldyBpdGVtc1xuICB0aGlzLmxheW91dEl0ZW1zKCBpdGVtcywgdHJ1ZSApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogTGF5b3V0IHByZXBlbmRlZCBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5wcmVwZW5kZWQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1pemUoIGVsZW1zICk7XG4gIGlmICggIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYWRkIGl0ZW1zIHRvIGJlZ2lubmluZyBvZiBjb2xsZWN0aW9uXG4gIHZhciBwcmV2aW91c0l0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcbiAgdGhpcy5pdGVtcyA9IGl0ZW1zLmNvbmNhdCggcHJldmlvdXNJdGVtcyApO1xuICAvLyBzdGFydCBuZXcgbGF5b3V0XG4gIHRoaXMuX3Jlc2V0TGF5b3V0KCk7XG4gIHRoaXMuX21hbmFnZVN0YW1wcygpO1xuICAvLyBsYXlvdXQgbmV3IHN0dWZmIHdpdGhvdXQgdHJhbnNpdGlvblxuICB0aGlzLmxheW91dEl0ZW1zKCBpdGVtcywgdHJ1ZSApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbiAgLy8gbGF5b3V0IHByZXZpb3VzIGl0ZW1zXG4gIHRoaXMubGF5b3V0SXRlbXMoIHByZXZpb3VzSXRlbXMgKTtcbn07XG5cbi8qKlxuICogcmV2ZWFsIGEgY29sbGVjdGlvbiBvZiBpdGVtc1xuICogQHBhcmFtIHtBcnJheSBvZiBPdXRsYXllci5JdGVtc30gaXRlbXNcbiAqL1xucHJvdG8ucmV2ZWFsID0gZnVuY3Rpb24oIGl0ZW1zICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAncmV2ZWFsJywgaXRlbXMgKTtcbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHN0YWdnZXIgPSB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0sIGkgKSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogc3RhZ2dlciApO1xuICAgIGl0ZW0ucmV2ZWFsKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBoaWRlIGEgY29sbGVjdGlvbiBvZiBpdGVtc1xuICogQHBhcmFtIHtBcnJheSBvZiBPdXRsYXllci5JdGVtc30gaXRlbXNcbiAqL1xucHJvdG8uaGlkZSA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ2hpZGUnLCBpdGVtcyApO1xuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc3RhZ2dlciA9IHRoaXMudXBkYXRlU3RhZ2dlcigpO1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSwgaSApIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiBzdGFnZ2VyICk7XG4gICAgaXRlbS5oaWRlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiByZXZlYWwgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheX0sIHtFbGVtZW50fSwge05vZGVMaXN0fSBpdGVtc1xuICovXG5wcm90by5yZXZlYWxJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG4gIHRoaXMucmV2ZWFsKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBoaWRlIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9LCB7RWxlbWVudH0sIHtOb2RlTGlzdH0gaXRlbXNcbiAqL1xucHJvdG8uaGlkZUl0ZW1FbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcbiAgdGhpcy5oaWRlKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBnZXQgT3V0bGF5ZXIuSXRlbSwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqL1xucHJvdG8uZ2V0SXRlbSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBsb29wIHRocm91Z2ggaXRlbXMgdG8gZ2V0IHRoZSBvbmUgdGhhdCBtYXRjaGVzXG4gIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICBpZiAoIGl0ZW0uZWxlbWVudCA9PSBlbGVtICkge1xuICAgICAgLy8gcmV0dXJuIGl0ZW1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBnZXQgY29sbGVjdGlvbiBvZiBPdXRsYXllci5JdGVtcywgZ2l2ZW4gRWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbiAqL1xucHJvdG8uZ2V0SXRlbXMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgaXRlbXMgPSBbXTtcbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgICBpZiAoIGl0ZW0gKSB7XG4gICAgICBpdGVtcy5wdXNoKCBpdGVtICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG5cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiByZW1vdmUgZWxlbWVudChzKSBmcm9tIGluc3RhbmNlIGFuZCBET01cbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgcmVtb3ZlSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuXG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdyZW1vdmUnLCByZW1vdmVJdGVtcyApO1xuXG4gIC8vIGJhaWwgaWYgbm8gaXRlbXMgdG8gcmVtb3ZlXG4gIGlmICggIXJlbW92ZUl0ZW1zIHx8ICFyZW1vdmVJdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVtb3ZlSXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5yZW1vdmUoKTtcbiAgICAvLyByZW1vdmUgaXRlbSBmcm9tIGNvbGxlY3Rpb25cbiAgICB1dGlscy5yZW1vdmVGcm9tKCB0aGlzLml0ZW1zLCBpdGVtICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tIGRlc3Ryb3kgLS0tLS0gLy9cblxuLy8gcmVtb3ZlIGFuZCBkaXNhYmxlIE91dGxheWVyIGluc3RhbmNlXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNsZWFuIHVwIGR5bmFtaWMgc3R5bGVzXG4gIHZhciBzdHlsZSA9IHRoaXMuZWxlbWVudC5zdHlsZTtcbiAgc3R5bGUuaGVpZ2h0ID0gJyc7XG4gIHN0eWxlLnBvc2l0aW9uID0gJyc7XG4gIHN0eWxlLndpZHRoID0gJyc7XG4gIC8vIGRlc3Ryb3kgaXRlbXNcbiAgdGhpcy5pdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgdGhpcy51bmJpbmRSZXNpemUoKTtcblxuICB2YXIgaWQgPSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO1xuICBkZWxldGUgaW5zdGFuY2VzWyBpZCBdOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIGluc3RhbmNlIGJ5IGlkXG4gIGRlbGV0ZSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO1xuICAvLyByZW1vdmUgZGF0YSBmb3IgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIGpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLmVsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlICk7XG4gIH1cblxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldCBPdXRsYXllciBpbnN0YW5jZSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge091dGxheWVyfVxuICovXG5PdXRsYXllci5kYXRhID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGVsZW0gPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW0gKTtcbiAgdmFyIGlkID0gZWxlbSAmJiBlbGVtLm91dGxheWVyR1VJRDtcbiAgcmV0dXJuIGlkICYmIGluc3RhbmNlc1sgaWQgXTtcbn07XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3JlYXRlIE91dGxheWVyIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogY3JlYXRlIGEgbGF5b3V0IGNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKi9cbk91dGxheWVyLmNyZWF0ZSA9IGZ1bmN0aW9uKCBuYW1lc3BhY2UsIG9wdGlvbnMgKSB7XG4gIC8vIHN1Yi1jbGFzcyBPdXRsYXllclxuICB2YXIgTGF5b3V0ID0gc3ViY2xhc3MoIE91dGxheWVyICk7XG4gIC8vIGFwcGx5IG5ldyBvcHRpb25zIGFuZCBjb21wYXRPcHRpb25zXG4gIExheW91dC5kZWZhdWx0cyA9IHV0aWxzLmV4dGVuZCgge30sIE91dGxheWVyLmRlZmF1bHRzICk7XG4gIHV0aWxzLmV4dGVuZCggTGF5b3V0LmRlZmF1bHRzLCBvcHRpb25zICk7XG4gIExheW91dC5jb21wYXRPcHRpb25zID0gdXRpbHMuZXh0ZW5kKCB7fSwgT3V0bGF5ZXIuY29tcGF0T3B0aW9ucyAgKTtcblxuICBMYXlvdXQubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXG4gIExheW91dC5kYXRhID0gT3V0bGF5ZXIuZGF0YTtcblxuICAvLyBzdWItY2xhc3MgSXRlbVxuICBMYXlvdXQuSXRlbSA9IHN1YmNsYXNzKCBJdGVtICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVjbGFyYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICB1dGlscy5odG1sSW5pdCggTGF5b3V0LCBuYW1lc3BhY2UgKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBqUXVlcnkgYnJpZGdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLy8gbWFrZSBpbnRvIGpRdWVyeSBwbHVnaW5cbiAgaWYgKCBqUXVlcnkgJiYgalF1ZXJ5LmJyaWRnZXQgKSB7XG4gICAgalF1ZXJ5LmJyaWRnZXQoIG5hbWVzcGFjZSwgTGF5b3V0ICk7XG4gIH1cblxuICByZXR1cm4gTGF5b3V0O1xufTtcblxuZnVuY3Rpb24gc3ViY2xhc3MoIFBhcmVudCApIHtcbiAgZnVuY3Rpb24gU3ViQ2xhc3MoKSB7XG4gICAgUGFyZW50LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcbiAgfVxuXG4gIFN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBhcmVudC5wcm90b3R5cGUgKTtcbiAgU3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViQ2xhc3M7XG5cbiAgcmV0dXJuIFN1YkNsYXNzO1xufVxuXG4vLyAtLS0tLSBoZWxwZXJzIC0tLS0tIC8vXG5cbi8vIGhvdyBtYW55IG1pbGxpc2Vjb25kcyBhcmUgaW4gZWFjaCB1bml0XG52YXIgbXNVbml0cyA9IHtcbiAgbXM6IDEsXG4gIHM6IDEwMDBcbn07XG5cbi8vIG11bmdlIHRpbWUtbGlrZSBwYXJhbWV0ZXIgaW50byBtaWxsaXNlY29uZCBudW1iZXJcbi8vICcwLjRzJyAtPiA0MFxuZnVuY3Rpb24gZ2V0TWlsbGlzZWNvbmRzKCB0aW1lICkge1xuICBpZiAoIHR5cGVvZiB0aW1lID09ICdudW1iZXInICkge1xuICAgIHJldHVybiB0aW1lO1xuICB9XG4gIHZhciBtYXRjaGVzID0gdGltZS5tYXRjaCggLyheXFxkKlxcLj9cXGQqKShcXHcqKS8gKTtcbiAgdmFyIG51bSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1sxXTtcbiAgdmFyIHVuaXQgPSBtYXRjaGVzICYmIG1hdGNoZXNbMl07XG4gIGlmICggIW51bS5sZW5ndGggKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbnVtID0gcGFyc2VGbG9hdCggbnVtICk7XG4gIHZhciBtdWx0ID0gbXNVbml0c1sgdW5pdCBdIHx8IDE7XG4gIHJldHVybiBudW0gKiBtdWx0O1xufVxuXG4vLyAtLS0tLSBmaW4gLS0tLS0gLy9cblxuLy8gYmFjayBpbiBnbG9iYWxcbk91dGxheWVyLkl0ZW0gPSBJdGVtO1xuXG5yZXR1cm4gT3V0bGF5ZXI7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFBO0FBQ0EsV0FrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/outlayer/outlayer.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/reframe.js/dist/reframe.es.js":
+/*!****************************************************!*\
+ !*** ./node_modules/reframe.js/dist/reframe.es.js ***!
+ \****************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction reframe(target, cName) {\n var frames = typeof target === 'string' ? document.querySelectorAll(target) : target;\n var c = cName || 'js-reframe';\n if (!('length' in frames)) frames = [frames];\n for (var i = 0; i < frames.length; i += 1) {\n var frame = frames[i];\n var hasClass = frame.className.split(' ').indexOf(c) !== -1;\n if (hasClass || frame.style.width.indexOf('%') > -1) continue;\n var h = frame.getAttribute('height') || frame.offsetHeight;\n var w = frame.getAttribute('width') || frame.offsetWidth;\n var padding = h / w * 100;\n var div = document.createElement('div');\n div.className = c;\n var divStyles = div.style;\n divStyles.position = 'relative';\n divStyles.width = '100%';\n divStyles.paddingTop = padding + \"%\";\n var frameStyle = frame.style;\n frameStyle.position = 'absolute';\n frameStyle.width = '100%';\n frameStyle.height = '100%';\n frameStyle.left = '0';\n frameStyle.top = '0';\n frame.parentNode.insertBefore(div, frame);\n frame.parentNode.removeChild(frame);\n div.appendChild(frame);\n }\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (reframe);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVmcmFtZS5qcy9kaXN0L3JlZnJhbWUuZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL3JlZnJhbWUuanMvZGlzdC9yZWZyYW1lLmVzLmpzP2IzNjkiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gcmVmcmFtZSh0YXJnZXQsIGNOYW1lKSB7XG4gIHZhciBmcmFtZXMgPSB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KSA6IHRhcmdldDtcbiAgdmFyIGMgPSBjTmFtZSB8fCAnanMtcmVmcmFtZSc7XG4gIGlmICghKCdsZW5ndGgnIGluIGZyYW1lcykpIGZyYW1lcyA9IFtmcmFtZXNdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBmcmFtZSA9IGZyYW1lc1tpXTtcbiAgICB2YXIgaGFzQ2xhc3MgPSBmcmFtZS5jbGFzc05hbWUuc3BsaXQoJyAnKS5pbmRleE9mKGMpICE9PSAtMTtcbiAgICBpZiAoaGFzQ2xhc3MgfHwgZnJhbWUuc3R5bGUud2lkdGguaW5kZXhPZignJScpID4gLTEpIGNvbnRpbnVlO1xuICAgIHZhciBoID0gZnJhbWUuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSB8fCBmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIHcgPSBmcmFtZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykgfHwgZnJhbWUub2Zmc2V0V2lkdGg7XG4gICAgdmFyIHBhZGRpbmcgPSBoIC8gdyAqIDEwMDtcbiAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IGM7XG4gICAgdmFyIGRpdlN0eWxlcyA9IGRpdi5zdHlsZTtcbiAgICBkaXZTdHlsZXMucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIGRpdlN0eWxlcy53aWR0aCA9ICcxMDAlJztcbiAgICBkaXZTdHlsZXMucGFkZGluZ1RvcCA9IHBhZGRpbmcgKyBcIiVcIjtcbiAgICB2YXIgZnJhbWVTdHlsZSA9IGZyYW1lLnN0eWxlO1xuICAgIGZyYW1lU3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGZyYW1lU3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgZnJhbWVTdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgZnJhbWVTdHlsZS5sZWZ0ID0gJzAnO1xuICAgIGZyYW1lU3R5bGUudG9wID0gJzAnO1xuICAgIGZyYW1lLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZnJhbWUpO1xuICAgIGZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZnJhbWUpO1xuICAgIGRpdi5hcHBlbmRDaGlsZChmcmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVmcmFtZTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/reframe.js/dist/reframe.es.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/scriptjs/dist/script.js":
+/*!**********************************************!*\
+ !*** ./node_modules/scriptjs/dist/script.js ***!
+ \**********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * $script.js JS loader & dependency manager\n * https://github.com/ded/script.js\n * (c) Dustin Diaz 2014 | License MIT\n */\n\n(function (name, definition) {\n if ( true && module.exports) module.exports = definition()\n else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n else {}\n})('$script', function () {\n var doc = document\n , head = doc.getElementsByTagName('head')[0]\n , s = 'string'\n , f = false\n , push = 'push'\n , readyState = 'readyState'\n , onreadystatechange = 'onreadystatechange'\n , list = {}\n , ids = {}\n , delay = {}\n , scripts = {}\n , scriptpath\n , urlArgs\n\n function every(ar, fn) {\n for (var i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f\n return 1\n }\n function each(ar, fn) {\n every(ar, function (el) {\n fn(el)\n return 1\n })\n }\n\n function $script(paths, idOrDone, optDone) {\n paths = paths[push] ? paths : [paths]\n var idOrDoneIsDone = idOrDone && idOrDone.call\n , done = idOrDoneIsDone ? idOrDone : optDone\n , id = idOrDoneIsDone ? paths.join('') : idOrDone\n , queue = paths.length\n function loopFn(item) {\n return item.call ? item() : list[item]\n }\n function callback() {\n if (!--queue) {\n list[id] = 1\n done && done()\n for (var dset in delay) {\n every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = [])\n }\n }\n }\n setTimeout(function () {\n each(paths, function loading(path, force) {\n if (path === null) return callback()\n \n if (!force && !/^https?:\\/\\//.test(path) && scriptpath) {\n path = (path.indexOf('.js') === -1) ? scriptpath + path + '.js' : scriptpath + path;\n }\n \n if (scripts[path]) {\n if (id) ids[id] = 1\n return (scripts[path] == 2) ? callback() : setTimeout(function () { loading(path, true) }, 0)\n }\n\n scripts[path] = 1\n if (id) ids[id] = 1\n create(path, callback)\n })\n }, 0)\n return $script\n }\n\n function create(path, fn) {\n var el = doc.createElement('script'), loaded\n el.onload = el.onerror = el[onreadystatechange] = function () {\n if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) return;\n el.onload = el[onreadystatechange] = null\n loaded = 1\n scripts[path] = 2\n fn()\n }\n el.async = 1\n el.src = urlArgs ? path + (path.indexOf('?') === -1 ? '?' : '&') + urlArgs : path;\n head.insertBefore(el, head.lastChild)\n }\n\n $script.get = create\n\n $script.order = function (scripts, id, done) {\n (function callback(s) {\n s = scripts.shift()\n !scripts.length ? $script(s, id, done) : $script(s, callback)\n }())\n }\n\n $script.path = function (p) {\n scriptpath = p\n }\n $script.urlArgs = function (str) {\n urlArgs = str;\n }\n $script.ready = function (deps, ready, req) {\n deps = deps[push] ? deps : [deps]\n var missing = [];\n !each(deps, function (dep) {\n list[dep] || missing[push](dep);\n }) && every(deps, function (dep) {return list[dep]}) ?\n ready() : !function (key) {\n delay[key] = delay[key] || []\n delay[key][push](ready)\n req && req(missing)\n }(deps.join('|'))\n return $script\n }\n\n $script.done = function (idOrDone) {\n $script([null], idOrDone)\n }\n\n return $script\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2NyaXB0anMvZGlzdC9zY3JpcHQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL3NjcmlwdGpzL2Rpc3Qvc2NyaXB0LmpzP2EyM2MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gICogJHNjcmlwdC5qcyBKUyBsb2FkZXIgJiBkZXBlbmRlbmN5IG1hbmFnZXJcbiAgKiBodHRwczovL2dpdGh1Yi5jb20vZGVkL3NjcmlwdC5qc1xuICAqIChjKSBEdXN0aW4gRGlheiAyMDE0IHwgTGljZW5zZSBNSVRcbiAgKi9cblxuKGZ1bmN0aW9uIChuYW1lLCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKGRlZmluaXRpb24pXG4gIGVsc2UgdGhpc1tuYW1lXSA9IGRlZmluaXRpb24oKVxufSkoJyRzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBkb2MgPSBkb2N1bWVudFxuICAgICwgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gICAgLCBzID0gJ3N0cmluZydcbiAgICAsIGYgPSBmYWxzZVxuICAgICwgcHVzaCA9ICdwdXNoJ1xuICAgICwgcmVhZHlTdGF0ZSA9ICdyZWFkeVN0YXRlJ1xuICAgICwgb25yZWFkeXN0YXRlY2hhbmdlID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgICAsIGxpc3QgPSB7fVxuICAgICwgaWRzID0ge31cbiAgICAsIGRlbGF5ID0ge31cbiAgICAsIHNjcmlwdHMgPSB7fVxuICAgICwgc2NyaXB0cGF0aFxuICAgICwgdXJsQXJnc1xuXG4gIGZ1bmN0aW9uIGV2ZXJ5KGFyLCBmbikge1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXIubGVuZ3RoOyBpIDwgajsgKytpKSBpZiAoIWZuKGFyW2ldKSkgcmV0dXJuIGZcbiAgICByZXR1cm4gMVxuICB9XG4gIGZ1bmN0aW9uIGVhY2goYXIsIGZuKSB7XG4gICAgZXZlcnkoYXIsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgZm4oZWwpXG4gICAgICByZXR1cm4gMVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiAkc2NyaXB0KHBhdGhzLCBpZE9yRG9uZSwgb3B0RG9uZSkge1xuICAgIHBhdGhzID0gcGF0aHNbcHVzaF0gPyBwYXRocyA6IFtwYXRoc11cbiAgICB2YXIgaWRPckRvbmVJc0RvbmUgPSBpZE9yRG9uZSAmJiBpZE9yRG9uZS5jYWxsXG4gICAgICAsIGRvbmUgPSBpZE9yRG9uZUlzRG9uZSA/IGlkT3JEb25lIDogb3B0RG9uZVxuICAgICAgLCBpZCA9IGlkT3JEb25lSXNEb25lID8gcGF0aHMuam9pbignJykgOiBpZE9yRG9uZVxuICAgICAgLCBxdWV1ZSA9IHBhdGhzLmxlbmd0aFxuICAgIGZ1bmN0aW9uIGxvb3BGbihpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5jYWxsID8gaXRlbSgpIDogbGlzdFtpdGVtXVxuICAgIH1cbiAgICBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIGlmICghLS1xdWV1ZSkge1xuICAgICAgICBsaXN0W2lkXSA9IDFcbiAgICAgICAgZG9uZSAmJiBkb25lKClcbiAgICAgICAgZm9yICh2YXIgZHNldCBpbiBkZWxheSkge1xuICAgICAgICAgIGV2ZXJ5KGRzZXQuc3BsaXQoJ3wnKSwgbG9vcEZuKSAmJiAhZWFjaChkZWxheVtkc2V0XSwgbG9vcEZuKSAmJiAoZGVsYXlbZHNldF0gPSBbXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGVhY2gocGF0aHMsIGZ1bmN0aW9uIGxvYWRpbmcocGF0aCwgZm9yY2UpIHtcbiAgICAgICAgaWYgKHBhdGggPT09IG51bGwpIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWZvcmNlICYmICEvXmh0dHBzPzpcXC9cXC8vLnRlc3QocGF0aCkgJiYgc2NyaXB0cGF0aCkge1xuICAgICAgICAgIHBhdGggPSAocGF0aC5pbmRleE9mKCcuanMnKSA9PT0gLTEpID8gc2NyaXB0cGF0aCArIHBhdGggKyAnLmpzJyA6IHNjcmlwdHBhdGggKyBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyaXB0c1twYXRoXSkge1xuICAgICAgICAgIGlmIChpZCkgaWRzW2lkXSA9IDFcbiAgICAgICAgICByZXR1cm4gKHNjcmlwdHNbcGF0aF0gPT0gMikgPyBjYWxsYmFjaygpIDogc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGxvYWRpbmcocGF0aCwgdHJ1ZSkgfSwgMClcbiAgICAgICAgfVxuXG4gICAgICAgIHNjcmlwdHNbcGF0aF0gPSAxXG4gICAgICAgIGlmIChpZCkgaWRzW2lkXSA9IDFcbiAgICAgICAgY3JlYXRlKHBhdGgsIGNhbGxiYWNrKVxuICAgICAgfSlcbiAgICB9LCAwKVxuICAgIHJldHVybiAkc2NyaXB0XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGUocGF0aCwgZm4pIHtcbiAgICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksIGxvYWRlZFxuICAgIGVsLm9ubG9hZCA9IGVsLm9uZXJyb3IgPSBlbFtvbnJlYWR5c3RhdGVjaGFuZ2VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKChlbFtyZWFkeVN0YXRlXSAmJiAhKC9eY3xsb2FkZS8udGVzdChlbFtyZWFkeVN0YXRlXSkpKSB8fCBsb2FkZWQpIHJldHVybjtcbiAgICAgIGVsLm9ubG9hZCA9IGVsW29ucmVhZHlzdGF0ZWNoYW5nZV0gPSBudWxsXG4gICAgICBsb2FkZWQgPSAxXG4gICAgICBzY3JpcHRzW3BhdGhdID0gMlxuICAgICAgZm4oKVxuICAgIH1cbiAgICBlbC5hc3luYyA9IDFcbiAgICBlbC5zcmMgPSB1cmxBcmdzID8gcGF0aCArIChwYXRoLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgdXJsQXJncyA6IHBhdGg7XG4gICAgaGVhZC5pbnNlcnRCZWZvcmUoZWwsIGhlYWQubGFzdENoaWxkKVxuICB9XG5cbiAgJHNjcmlwdC5nZXQgPSBjcmVhdGVcblxuICAkc2NyaXB0Lm9yZGVyID0gZnVuY3Rpb24gKHNjcmlwdHMsIGlkLCBkb25lKSB7XG4gICAgKGZ1bmN0aW9uIGNhbGxiYWNrKHMpIHtcbiAgICAgIHMgPSBzY3JpcHRzLnNoaWZ0KClcbiAgICAgICFzY3JpcHRzLmxlbmd0aCA/ICRzY3JpcHQocywgaWQsIGRvbmUpIDogJHNjcmlwdChzLCBjYWxsYmFjaylcbiAgICB9KCkpXG4gIH1cblxuICAkc2NyaXB0LnBhdGggPSBmdW5jdGlvbiAocCkge1xuICAgIHNjcmlwdHBhdGggPSBwXG4gIH1cbiAgJHNjcmlwdC51cmxBcmdzID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHVybEFyZ3MgPSBzdHI7XG4gIH1cbiAgJHNjcmlwdC5yZWFkeSA9IGZ1bmN0aW9uIChkZXBzLCByZWFkeSwgcmVxKSB7XG4gICAgZGVwcyA9IGRlcHNbcHVzaF0gPyBkZXBzIDogW2RlcHNdXG4gICAgdmFyIG1pc3NpbmcgPSBbXTtcbiAgICAhZWFjaChkZXBzLCBmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBsaXN0W2RlcF0gfHwgbWlzc2luZ1twdXNoXShkZXApO1xuICAgIH0pICYmIGV2ZXJ5KGRlcHMsIGZ1bmN0aW9uIChkZXApIHtyZXR1cm4gbGlzdFtkZXBdfSkgP1xuICAgICAgcmVhZHkoKSA6ICFmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWxheVtrZXldID0gZGVsYXlba2V5XSB8fCBbXVxuICAgICAgZGVsYXlba2V5XVtwdXNoXShyZWFkeSlcbiAgICAgIHJlcSAmJiByZXEobWlzc2luZylcbiAgICB9KGRlcHMuam9pbignfCcpKVxuICAgIHJldHVybiAkc2NyaXB0XG4gIH1cblxuICAkc2NyaXB0LmRvbmUgPSBmdW5jdGlvbiAoaWRPckRvbmUpIHtcbiAgICAkc2NyaXB0KFtudWxsXSwgaWRPckRvbmUpXG4gIH1cblxuICByZXR1cm4gJHNjcmlwdFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/scriptjs/dist/script.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/scroll-lock/dist/scroll-lock.js":
+/*!******************************************************!*\
+ !*** ./node_modules/scroll-lock/dist/scroll-lock.js ***!
+ \******************************************************/
+/***/ (function(module) {
+
+eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_543__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__nested_webpack_require_543__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__nested_webpack_require_543__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__nested_webpack_require_543__.d = function(exports, name, getter) {\n/******/ \t\tif(!__nested_webpack_require_543__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__nested_webpack_require_543__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__nested_webpack_require_543__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __nested_webpack_require_543__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__nested_webpack_require_543__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_543__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__nested_webpack_require_543__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__nested_webpack_require_543__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__nested_webpack_require_543__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __nested_webpack_require_543__(__nested_webpack_require_543__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __nested_webpack_require_4019__) {\n\n\"use strict\";\n__nested_webpack_require_4019__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n if (nodeList && callback) {\n nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n for (var i = 0; i < nodeList.length; i++) {\n if (callback(nodeList[i], i, nodeList.length) === true) {\n break;\n }\n }\n }\n};\nvar throwError = function throwError(message) {\n return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n if (Array.isArray(array)) {\n var selector = array.join(', ');\n return selector;\n }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n var nodes = [];\n eachNode(nodeList, function (node) {\n return nodes.push(node);\n });\n return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n return $el;\n }\n\n while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n ;\n }\n\n return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n if ($el) {\n var computedStyle = getComputedStyle($el);\n var overflowIsHidden = computedStyle.overflow === 'hidden';\n return overflowIsHidden;\n }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollTop = $el.scrollTop;\n return scrollTop <= 0;\n }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollTop = $el.scrollTop;\n var scrollHeight = $el.scrollHeight;\n var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n return scrollTopWithHeight >= scrollHeight;\n }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollLeft = $el.scrollLeft;\n return scrollLeft <= 0;\n }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollLeft = $el.scrollLeft;\n var scrollWidth = $el.scrollWidth;\n var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n return scrollLeftWithWidth >= scrollWidth;\n }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n var selector = 'textarea, [contenteditable=\"true\"]';\n return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n var selector = 'input[type=\"range\"]';\n return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n scroll: true,\n queue: 0,\n scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n //\n startTouchY: 0,\n startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n if (state.queue <= 0) {\n state.scroll = false;\n scroll_lock_hideLockableOverflow();\n fillGaps();\n }\n\n scroll_lock_addScrollableTarget(target);\n state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n state.queue > 0 && state.queue--;\n\n if (state.queue <= 0) {\n state.scroll = true;\n scroll_lock_showLockableOverflow();\n unfillGaps();\n }\n\n scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (isElement($target)) {\n var currentOverflowYProperty = $target.style.overflowY;\n\n if (onlyExists) {\n if (!getScrollState()) {\n $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n }\n } else {\n $target.style.overflowY = 'scroll';\n }\n\n var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n $target.style.overflowY = currentOverflowYProperty;\n return width;\n } else {\n return 0;\n }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n if (isElement($target)) {\n if ($target === document.body) {\n var documentWidth = document.documentElement.clientWidth;\n var windowWidth = window.innerWidth;\n var currentWidth = windowWidth - documentWidth;\n return currentWidth;\n } else {\n var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n $target.style.borderLeftWidth = '0px';\n $target.style.borderRightWidth = '0px';\n\n var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n return _currentWidth;\n }\n } else {\n return 0;\n }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.setAttribute('data-scroll-lock-scrollable', '');\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.removeAttribute('data-scroll-lock-scrollable');\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.scrollableSelectors.push(selector);\n });\n }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n return sSelector !== selector;\n });\n });\n }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.setAttribute('data-scroll-lock-lockable', '');\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n\n if (!getScrollState()) {\n scroll_lock_hideLockableOverflow();\n }\n }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.lockableSelectors.push(selector);\n });\n\n if (!getScrollState()) {\n scroll_lock_hideLockableOverflow();\n }\n\n scroll_lock_addFillGapSelector(selector);\n }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n if (method) {\n if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n state.fillGapMethod = method;\n refillGaps();\n } else {\n var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n }\n }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n if (!state.scroll) {\n scroll_lock_fillGapTarget($target);\n }\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.removeAttribute('data-scroll-lock-fill-gap');\n\n if (!state.scroll) {\n scroll_lock_unfillGapTarget($target);\n }\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n if (state.fillGapSelectors.indexOf(selector) === -1) {\n state.fillGapSelectors.push(selector);\n\n if (!state.scroll) {\n scroll_lock_fillGapSelector(selector);\n }\n }\n });\n }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n return fSelector !== selector;\n });\n\n if (!state.scroll) {\n scroll_lock_unfillGapSelector(selector);\n }\n });\n }\n};\nvar refillGaps = function refillGaps() {\n if (!state.scroll) {\n fillGaps();\n }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n var selector = arrayAsSelector(state.lockableSelectors);\n scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n var selector = arrayAsSelector(state.lockableSelectors);\n scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n eachNode($targets, function ($target) {\n scroll_lock_hideLockableOverflowTarget($target);\n });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n eachNode($targets, function ($target) {\n scroll_lock_showLockableOverflowTarget($target);\n });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n var computedStyle = window.getComputedStyle($target);\n $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n $target.style.overflow = 'hidden';\n $target.setAttribute('data-scroll-lock-locked', 'true');\n }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n $target.removeAttribute('data-scroll-lock-locked');\n }\n};\n\nvar fillGaps = function fillGaps() {\n state.fillGapSelectors.map(function (selector) {\n scroll_lock_fillGapSelector(selector);\n });\n};\n\nvar unfillGaps = function unfillGaps() {\n state.fillGapSelectors.map(function (selector) {\n scroll_lock_unfillGapSelector(selector);\n });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n eachNode($targets, function ($target) {\n scroll_lock_fillGapTarget($target, isLockable);\n });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (isElement($target)) {\n var scrollBarWidth;\n\n if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n } else {\n var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n }\n\n if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n scroll_lock_unfillGapTarget($target);\n }\n\n var computedStyle = window.getComputedStyle($target);\n $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n if (state.fillGapMethod === 'margin') {\n var currentMargin = parseFloat(computedStyle.marginRight);\n $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n } else if (state.fillGapMethod === 'width') {\n $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n } else if (state.fillGapMethod === 'max-width') {\n $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n } else if (state.fillGapMethod === 'padding') {\n var currentPadding = parseFloat(computedStyle.paddingRight);\n $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n }\n }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n eachNode($targets, function ($target) {\n scroll_lock_unfillGapTarget($target);\n });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n if (isElement($target)) {\n if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n $target.removeAttribute('data-scroll-lock-filled-gap');\n $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n if (currentFillGapMethod === 'margin') {\n $target.style.marginRight = \"\";\n } else if (currentFillGapMethod === 'width') {\n $target.style.width = \"\";\n } else if (currentFillGapMethod === 'max-width') {\n $target.style.maxWidth = \"\";\n } else if (currentFillGapMethod === 'padding') {\n $target.style.paddingRight = \"\";\n }\n }\n }\n};\n\nvar onResize = function onResize(e) {\n refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n if (!state.scroll) {\n state.startTouchY = e.touches[0].clientY;\n state.startTouchX = e.touches[0].clientX;\n }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n if (!state.scroll) {\n var startTouchY = state.startTouchY,\n startTouchX = state.startTouchX;\n var currentClientY = e.touches[0].clientY;\n var currentClientX = e.touches[0].clientX;\n\n if (e.touches.length < 2) {\n var selector = arrayAsSelector(state.scrollableSelectors);\n var direction = {\n up: startTouchY < currentClientY,\n down: startTouchY > currentClientY,\n left: startTouchX < currentClientX,\n right: startTouchX > currentClientX\n };\n var directionWithOffset = {\n up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n };\n\n var handle = function handle($el) {\n var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if ($el) {\n var parentScrollableEl = findParentBySelector($el, selector, false);\n\n if (elementIsInputRange($el)) {\n return false;\n }\n\n if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n var prevent = false;\n\n if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n prevent = true;\n }\n } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n prevent = true;\n }\n } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n prevent = true;\n }\n\n if (prevent) {\n if (parentScrollableEl) {\n handle(parentScrollableEl, true);\n } else {\n if (e.cancelable) {\n e.preventDefault();\n }\n }\n }\n } else {\n handle(parentScrollableEl);\n }\n } else {\n if (e.cancelable) {\n e.preventDefault();\n }\n }\n };\n\n handle(e.target);\n }\n }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n if (!state.scroll) {\n state.startTouchY = 0;\n state.startTouchX = 0;\n }\n};\n\nif (typeof window !== 'undefined') {\n window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n document.addEventListener('touchstart', onTouchStart);\n document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n passive: false\n });\n document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n hide: function hide(target) {\n throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n disablePageScroll(target);\n },\n show: function show(target) {\n throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n enablePageScroll(target);\n },\n toggle: function toggle(target) {\n throwError('\"toggle\" is deprecated! Do not use it.');\n\n if (getScrollState()) {\n disablePageScroll();\n } else {\n enablePageScroll(target);\n }\n },\n getState: function getState() {\n throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n return getScrollState();\n },\n getWidth: function getWidth() {\n throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n return getPageScrollBarWidth();\n },\n getCurrentWidth: function getCurrentWidth() {\n throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n return getCurrentPageScrollBarWidth();\n },\n setScrollableTargets: function setScrollableTargets(target) {\n throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n scroll_lock_addScrollableTarget(target);\n },\n setFillGapSelectors: function setFillGapSelectors(selector) {\n throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n scroll_lock_addFillGapSelector(selector);\n },\n setFillGapTargets: function setFillGapTargets(target) {\n throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n scroll_lock_addFillGapTarget(target);\n },\n clearQueue: function clearQueue() {\n throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n clearQueueScrollLocks();\n }\n};\n\nvar scrollLock = _objectSpread({\n disablePageScroll: disablePageScroll,\n enablePageScroll: enablePageScroll,\n getScrollState: getScrollState,\n clearQueueScrollLocks: clearQueueScrollLocks,\n getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n getPageScrollBarWidth: getPageScrollBarWidth,\n getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n addScrollableSelector: scroll_lock_addScrollableSelector,\n removeScrollableSelector: scroll_lock_removeScrollableSelector,\n addScrollableTarget: scroll_lock_addScrollableTarget,\n removeScrollableTarget: scroll_lock_removeScrollableTarget,\n addLockableSelector: scroll_lock_addLockableSelector,\n addLockableTarget: scroll_lock_addLockableTarget,\n addFillGapSelector: scroll_lock_addFillGapSelector,\n removeFillGapSelector: scroll_lock_removeFillGapSelector,\n addFillGapTarget: scroll_lock_addFillGapTarget,\n removeFillGapTarget: scroll_lock_removeFillGapTarget,\n setFillGapMethod: scroll_lock_setFillGapMethod,\n refillGaps: refillGaps,\n _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWxvY2svZGlzdC9zY3JvbGwtbG9jay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWxvY2svZGlzdC9zY3JvbGwtbG9jay5qcz8zMjUxIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInNjcm9sbExvY2tcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wic2Nyb2xsTG9ja1wiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy90b29scy5qc1xudmFyIGFyZ3VtZW50QXNBcnJheSA9IGZ1bmN0aW9uIGFyZ3VtZW50QXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmd1bWVudCkgPyBhcmd1bWVudCA6IFthcmd1bWVudF07XG59O1xudmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIGlzRWxlbWVudCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE5vZGU7XG59O1xudmFyIGlzRWxlbWVudExpc3QgPSBmdW5jdGlvbiBpc0VsZW1lbnRMaXN0KG5vZGVMaXN0KSB7XG4gIHJldHVybiBub2RlTGlzdCBpbnN0YW5jZW9mIE5vZGVMaXN0O1xufTtcbnZhciBlYWNoTm9kZSA9IGZ1bmN0aW9uIGVhY2hOb2RlKG5vZGVMaXN0LCBjYWxsYmFjaykge1xuICBpZiAobm9kZUxpc3QgJiYgY2FsbGJhY2spIHtcbiAgICBub2RlTGlzdCA9IGlzRWxlbWVudExpc3Qobm9kZUxpc3QpID8gbm9kZUxpc3QgOiBbbm9kZUxpc3RdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrKG5vZGVMaXN0W2ldLCBpLCBub2RlTGlzdC5sZW5ndGgpID09PSB0cnVlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciB0aHJvd0Vycm9yID0gZnVuY3Rpb24gdGhyb3dFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBjb25zb2xlLmVycm9yKFwiW3Njcm9sbC1sb2NrXSBcIi5jb25jYXQobWVzc2FnZSkpO1xufTtcbnZhciBhcnJheUFzU2VsZWN0b3IgPSBmdW5jdGlvbiBhcnJheUFzU2VsZWN0b3IoYXJyYXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gYXJyYXkuam9pbignLCAnKTtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbn07XG52YXIgbm9kZUxpc3RBc0FycmF5ID0gZnVuY3Rpb24gbm9kZUxpc3RBc0FycmF5KG5vZGVMaXN0KSB7XG4gIHZhciBub2RlcyA9IFtdO1xuICBlYWNoTm9kZShub2RlTGlzdCwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZXMucHVzaChub2RlKTtcbiAgfSk7XG4gIHJldHVybiBub2Rlcztcbn07XG52YXIgZmluZFBhcmVudEJ5U2VsZWN0b3IgPSBmdW5jdGlvbiBmaW5kUGFyZW50QnlTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBzZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICB2YXIgJHJvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGRvY3VtZW50O1xuXG4gIGlmIChzZWxmICYmIG5vZGVMaXN0QXNBcnJheSgkcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuaW5kZXhPZigkZWwpICE9PSAtMSkge1xuICAgIHJldHVybiAkZWw7XG4gIH1cblxuICB3aGlsZSAoKCRlbCA9ICRlbC5wYXJlbnRFbGVtZW50KSAmJiBub2RlTGlzdEFzQXJyYXkoJHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmluZGV4T2YoJGVsKSA9PT0gLTEpIHtcbiAgICA7XG4gIH1cblxuICByZXR1cm4gJGVsO1xufTtcbnZhciBlbGVtZW50SGFzU2VsZWN0b3IgPSBmdW5jdGlvbiBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3Rvcikge1xuICB2YXIgJHJvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRvY3VtZW50O1xuICB2YXIgaGFzID0gbm9kZUxpc3RBc0FycmF5KCRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5pbmRleE9mKCRlbCkgIT09IC0xO1xuICByZXR1cm4gaGFzO1xufTtcbnZhciBlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4gPSBmdW5jdGlvbiBlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4oJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoJGVsKTtcbiAgICB2YXIgb3ZlcmZsb3dJc0hpZGRlbiA9IGNvbXB1dGVkU3R5bGUub3ZlcmZsb3cgPT09ICdoaWRkZW4nO1xuICAgIHJldHVybiBvdmVyZmxvd0lzSGlkZGVuO1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0ID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICBpZiAoZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxUb3AgPSAkZWwuc2Nyb2xsVG9wO1xuICAgIHJldHVybiBzY3JvbGxUb3AgPD0gMDtcbiAgfVxufTtcbnZhciBlbGVtZW50U2Nyb2xsVG9wT25FbmQgPSBmdW5jdGlvbiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICBpZiAoZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxUb3AgPSAkZWwuc2Nyb2xsVG9wO1xuICAgIHZhciBzY3JvbGxIZWlnaHQgPSAkZWwuc2Nyb2xsSGVpZ2h0O1xuICAgIHZhciBzY3JvbGxUb3BXaXRoSGVpZ2h0ID0gc2Nyb2xsVG9wICsgJGVsLm9mZnNldEhlaWdodDtcbiAgICByZXR1cm4gc2Nyb2xsVG9wV2l0aEhlaWdodCA+PSBzY3JvbGxIZWlnaHQ7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0ID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsTGVmdCA9ICRlbC5zY3JvbGxMZWZ0O1xuICAgIHJldHVybiBzY3JvbGxMZWZ0IDw9IDA7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbExlZnRPbkVuZCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICBpZiAoZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxMZWZ0ID0gJGVsLnNjcm9sbExlZnQ7XG4gICAgdmFyIHNjcm9sbFdpZHRoID0gJGVsLnNjcm9sbFdpZHRoO1xuICAgIHZhciBzY3JvbGxMZWZ0V2l0aFdpZHRoID0gc2Nyb2xsTGVmdCArICRlbC5vZmZzZXRXaWR0aDtcbiAgICByZXR1cm4gc2Nyb2xsTGVmdFdpdGhXaWR0aCA+PSBzY3JvbGxXaWR0aDtcbiAgfVxufTtcbnZhciBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQgPSBmdW5jdGlvbiBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQoJGVsKSB7XG4gIHZhciBzZWxlY3RvciA9ICd0ZXh0YXJlYSwgW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nO1xuICByZXR1cm4gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpO1xufTtcbnZhciBlbGVtZW50SXNJbnB1dFJhbmdlID0gZnVuY3Rpb24gZWxlbWVudElzSW5wdXRSYW5nZSgkZWwpIHtcbiAgdmFyIHNlbGVjdG9yID0gJ2lucHV0W3R5cGU9XCJyYW5nZVwiXSc7XG4gIHJldHVybiBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3Rvcik7XG59O1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2Nyb2xsLWxvY2suanNcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJkaXNhYmxlUGFnZVNjcm9sbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGRpc2FibGVQYWdlU2Nyb2xsOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJlbmFibGVQYWdlU2Nyb2xsXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZW5hYmxlUGFnZVNjcm9sbDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0U2Nyb2xsU3RhdGVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRTY3JvbGxTdGF0ZTsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY2xlYXJRdWV1ZVNjcm9sbExvY2tzXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY2xlYXJRdWV1ZVNjcm9sbExvY2tzOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRUYXJnZXRTY3JvbGxCYXJXaWR0aFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldFBhZ2VTY3JvbGxCYXJXaWR0aFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGdldFBhZ2VTY3JvbGxCYXJXaWR0aDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZFNjcm9sbGFibGVUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVTY3JvbGxhYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkU2Nyb2xsYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZExvY2thYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZExvY2thYmxlU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRMb2NrYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJzZXRGaWxsR2FwTWV0aG9kXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkRmlsbEdhcFRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlbW92ZUZpbGxHYXBUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRGaWxsR2FwU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRGaWxsR2FwU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlbW92ZUZpbGxHYXBTZWxlY3RvclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVmaWxsR2Fwc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJlZmlsbEdhcHM7IH0pO1xuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5cbnZhciBGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUyA9IFsncGFkZGluZycsICdtYXJnaW4nLCAnd2lkdGgnLCAnbWF4LXdpZHRoJywgJ25vbmUnXTtcbnZhciBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA9IDM7XG52YXIgc3RhdGUgPSB7XG4gIHNjcm9sbDogdHJ1ZSxcbiAgcXVldWU6IDAsXG4gIHNjcm9sbGFibGVTZWxlY3RvcnM6IFsnW2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZV0nXSxcbiAgbG9ja2FibGVTZWxlY3RvcnM6IFsnYm9keScsICdbZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZV0nXSxcbiAgZmlsbEdhcFNlbGVjdG9yczogWydib2R5JywgJ1tkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwXScsICdbZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZV0nXSxcbiAgZmlsbEdhcE1ldGhvZDogRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFNbMF0sXG4gIC8vXG4gIHN0YXJ0VG91Y2hZOiAwLFxuICBzdGFydFRvdWNoWDogMFxufTtcbnZhciBkaXNhYmxlUGFnZVNjcm9sbCA9IGZ1bmN0aW9uIGRpc2FibGVQYWdlU2Nyb2xsKHRhcmdldCkge1xuICBpZiAoc3RhdGUucXVldWUgPD0gMCkge1xuICAgIHN0YXRlLnNjcm9sbCA9IGZhbHNlO1xuICAgIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93KCk7XG4gICAgZmlsbEdhcHMoKTtcbiAgfVxuXG4gIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVUYXJnZXQodGFyZ2V0KTtcbiAgc3RhdGUucXVldWUrKztcbn07XG52YXIgZW5hYmxlUGFnZVNjcm9sbCA9IGZ1bmN0aW9uIGVuYWJsZVBhZ2VTY3JvbGwodGFyZ2V0KSB7XG4gIHN0YXRlLnF1ZXVlID4gMCAmJiBzdGF0ZS5xdWV1ZS0tO1xuXG4gIGlmIChzdGF0ZS5xdWV1ZSA8PSAwKSB7XG4gICAgc3RhdGUuc2Nyb2xsID0gdHJ1ZTtcbiAgICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvdygpO1xuICAgIHVuZmlsbEdhcHMoKTtcbiAgfVxuXG4gIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQodGFyZ2V0KTtcbn07XG52YXIgZ2V0U2Nyb2xsU3RhdGUgPSBmdW5jdGlvbiBnZXRTY3JvbGxTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlLnNjcm9sbDtcbn07XG52YXIgY2xlYXJRdWV1ZVNjcm9sbExvY2tzID0gZnVuY3Rpb24gY2xlYXJRdWV1ZVNjcm9sbExvY2tzKCkge1xuICBzdGF0ZS5xdWV1ZSA9IDA7XG59O1xudmFyIHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoJHRhcmdldCkge1xuICB2YXIgb25seUV4aXN0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIHZhciBjdXJyZW50T3ZlcmZsb3dZUHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WTtcblxuICAgIGlmIChvbmx5RXhpc3RzKSB7XG4gICAgICBpZiAoIWdldFNjcm9sbFN0YXRlKCkpIHtcbiAgICAgICAgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1vdmVyZmxvdy15LXByb3BlcnR5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gJ3Njcm9sbCc7XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoID0gc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpO1xuICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gY3VycmVudE92ZXJmbG93WVByb3BlcnR5O1xuICAgIHJldHVybiB3aWR0aDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGggPSBmdW5jdGlvbiBnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgaWYgKCR0YXJnZXQgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHZhciBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgdmFyIHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB2YXIgY3VycmVudFdpZHRoID0gd2luZG93V2lkdGggLSBkb2N1bWVudFdpZHRoO1xuICAgICAgcmV0dXJuIGN1cnJlbnRXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJvcmRlckxlZnRXaWR0aEN1cnJlbnRQcm9wZXJ0eSA9ICR0YXJnZXQuc3R5bGUuYm9yZGVyTGVmdFdpZHRoO1xuICAgICAgdmFyIGJvcmRlclJpZ2h0V2lkdGhDdXJyZW50UHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLmJvcmRlclJpZ2h0V2lkdGg7XG4gICAgICAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9ICcwcHgnO1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gJzBweCc7XG5cbiAgICAgIHZhciBfY3VycmVudFdpZHRoID0gJHRhcmdldC5vZmZzZXRXaWR0aCAtICR0YXJnZXQuY2xpZW50V2lkdGg7XG5cbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyTGVmdFdpZHRoID0gYm9yZGVyTGVmdFdpZHRoQ3VycmVudFByb3BlcnR5O1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gYm9yZGVyUmlnaHRXaWR0aEN1cnJlbnRQcm9wZXJ0eTtcbiAgICAgIHJldHVybiBfY3VycmVudFdpZHRoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBnZXRQYWdlU2Nyb2xsQmFyV2lkdGggPSBmdW5jdGlvbiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgoKSB7XG4gIHZhciBvbmx5RXhpc3RzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgcmV0dXJuIHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoKGRvY3VtZW50LmJvZHksIG9ubHlFeGlzdHMpO1xufTtcbnZhciBnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCgpIHtcbiAgcmV0dXJuIHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aChkb2N1bWVudC5ib2R5KTtcbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCA9IGZ1bmN0aW9uIGFkZFNjcm9sbGFibGVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zY3JvbGxhYmxlJywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQgPSBmdW5jdGlvbiByZW1vdmVTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZFNjcm9sbGFibGVTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3IgPSBmdW5jdGlvbiByZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLnNjcm9sbGFibGVTZWxlY3RvcnMgPSBzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbiAoc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBzU2VsZWN0b3IgIT09IHNlbGVjdG9yO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVUYXJnZXQgPSBmdW5jdGlvbiBhZGRMb2NrYWJsZVRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2thYmxlJywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIH1cbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRMb2NrYWJsZVNlbGVjdG9yID0gZnVuY3Rpb24gYWRkTG9ja2FibGVTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUubG9ja2FibGVTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgfSk7XG5cbiAgICBpZiAoIWdldFNjcm9sbFN0YXRlKCkpIHtcbiAgICAgIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93KCk7XG4gICAgfVxuXG4gICAgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19zZXRGaWxsR2FwTWV0aG9kID0gZnVuY3Rpb24gc2V0RmlsbEdhcE1ldGhvZChtZXRob2QpIHtcbiAgaWYgKG1ldGhvZCkge1xuICAgIGlmIChGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUy5pbmRleE9mKG1ldGhvZCkgIT09IC0xKSB7XG4gICAgICBzdGF0ZS5maWxsR2FwTWV0aG9kID0gbWV0aG9kO1xuICAgICAgcmVmaWxsR2FwcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWV0aG9kcyA9IEZJTExfR0FQX0FWQUlMQUJMRV9NRVRIT0RTLmpvaW4oJywgJyk7XG4gICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdChtZXRob2QsIFwiXFxcIiBtZXRob2QgaXMgbm90IGF2YWlsYWJsZSFcXG5BdmFpbGFibGUgZmlsbCBnYXAgbWV0aG9kczogXCIpLmNvbmNhdChtZXRob2RzLCBcIi5cIikpO1xuICAgIH1cbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRGaWxsR2FwVGFyZ2V0ID0gZnVuY3Rpb24gYWRkRmlsbEdhcFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwJywgJycpO1xuXG4gICAgICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiByZW1vdmVGaWxsR2FwVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbC1nYXAnKTtcblxuICAgICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgaWYgKHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMuaW5kZXhPZihzZWxlY3RvcikgPT09IC0xKSB7XG4gICAgICAgIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxfbG9ja19maWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFNlbGVjdG9yID0gZnVuY3Rpb24gcmVtb3ZlRmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHZhciBzZWxlY3RvcnMgPSBhcmd1bWVudEFzQXJyYXkoc2VsZWN0b3IpO1xuICAgIHNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzID0gc3RhdGUuZmlsbEdhcFNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKGZTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZlNlbGVjdG9yICE9PSBzZWxlY3RvcjtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgICAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG52YXIgcmVmaWxsR2FwcyA9IGZ1bmN0aW9uIHJlZmlsbEdhcHMoKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgZmlsbEdhcHMoKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93ID0gZnVuY3Rpb24gaGlkZUxvY2thYmxlT3ZlcmZsb3coKSB7XG4gIHZhciBzZWxlY3RvciA9IGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycyk7XG4gIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3Ioc2VsZWN0b3IpO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93ID0gZnVuY3Rpb24gc2hvd0xvY2thYmxlT3ZlcmZsb3coKSB7XG4gIHZhciBzZWxlY3RvciA9IGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycyk7XG4gIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3Ioc2VsZWN0b3IpO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3IgPSBmdW5jdGlvbiBoaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3dTZWxlY3RvciA9IGZ1bmN0aW9uIHNob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgdmFyICR0YXJnZXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93VGFyZ2V0KCR0YXJnZXQpO1xuICB9KTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCA9IGZ1bmN0aW9uIGhpZGVMb2NrYWJsZU92ZXJmbG93VGFyZ2V0KCR0YXJnZXQpIHtcbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSAmJiAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnKSAhPT0gJ3RydWUnKSB7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1vdmVyZmxvdy15LXByb3BlcnR5JywgY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1kpO1xuICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLWlubGluZS1vdmVyZmxvdy1wcm9wZXJ0eScsICR0YXJnZXQuc3R5bGUub3ZlcmZsb3cpO1xuICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLWlubGluZS1vdmVyZmxvdy15LXByb3BlcnR5JywgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kpO1xuICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnLCAndHJ1ZScpO1xuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3dUYXJnZXQgPSBmdW5jdGlvbiBzaG93TG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkgJiYgJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJykgPT09ICd0cnVlJykge1xuICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3cgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLWlubGluZS1vdmVyZmxvdy15LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3ctcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2tlZCcpO1xuICB9XG59O1xuXG52YXIgZmlsbEdhcHMgPSBmdW5jdGlvbiBmaWxsR2FwcygpIHtcbiAgc3RhdGUuZmlsbEdhcFNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSk7XG59O1xuXG52YXIgdW5maWxsR2FwcyA9IGZ1bmN0aW9uIHVuZmlsbEdhcHMoKSB7XG4gIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHNjcm9sbF9sb2NrX3VuZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yID0gZnVuY3Rpb24gZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB2YXIgaXNMb2NrYWJsZSA9IHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzLmluZGV4T2Yoc2VsZWN0b3IpICE9PSAtMTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFRhcmdldCgkdGFyZ2V0LCBpc0xvY2thYmxlKTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfZmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIGZpbGxHYXBUYXJnZXQoJHRhcmdldCkge1xuICB2YXIgaXNMb2NrYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIHZhciBzY3JvbGxCYXJXaWR0aDtcblxuICAgIGlmICgkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZScpID09PSAnJyB8fCBpc0xvY2thYmxlKSB7XG4gICAgICBzY3JvbGxCYXJXaWR0aCA9IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgJGxvY2thYmxlUGFyZW50ID0gZmluZFBhcmVudEJ5U2VsZWN0b3IoJHRhcmdldCwgYXJyYXlBc1NlbGVjdG9yKHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzKSk7XG4gICAgICBzY3JvbGxCYXJXaWR0aCA9IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoKCRsb2NrYWJsZVBhcmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGxlZC1nYXAnKSA9PT0gJ3RydWUnKSB7XG4gICAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gICAgfVxuXG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJywgJ3RydWUnKTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcsIHN0YXRlLmZpbGxHYXBNZXRob2QpO1xuXG4gICAgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdtYXJnaW4nKSB7XG4gICAgICB2YXIgY3VycmVudE1hcmdpbiA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCk7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCJcIi5jb25jYXQoY3VycmVudE1hcmdpbiArIHNjcm9sbEJhcldpZHRoLCBcInB4XCIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZmlsbEdhcE1ldGhvZCA9PT0gJ3dpZHRoJykge1xuICAgICAgJHRhcmdldC5zdHlsZS53aWR0aCA9IFwiY2FsYygxMDAlIC0gXCIuY29uY2F0KHNjcm9sbEJhcldpZHRoLCBcInB4KVwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdtYXgtd2lkdGgnKSB7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm1heFdpZHRoID0gXCJjYWxjKDEwMCUgLSBcIi5jb25jYXQoc2Nyb2xsQmFyV2lkdGgsIFwicHgpXCIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZmlsbEdhcE1ldGhvZCA9PT0gJ3BhZGRpbmcnKSB7XG4gICAgICB2YXIgY3VycmVudFBhZGRpbmcgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KTtcbiAgICAgICR0YXJnZXQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCJcIi5jb25jYXQoY3VycmVudFBhZGRpbmcgKyBzY3JvbGxCYXJXaWR0aCwgXCJweFwiKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIHVuZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3VuZmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIHVuZmlsbEdhcFRhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICBpZiAoJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcpID09PSAndHJ1ZScpIHtcbiAgICAgIHZhciBjdXJyZW50RmlsbEdhcE1ldGhvZCA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWN1cnJlbnQtZmlsbC1nYXAtbWV0aG9kJyk7XG4gICAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJyk7XG4gICAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcpO1xuXG4gICAgICBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdtYXJnaW4nKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUubWFyZ2luUmlnaHQgPSBcIlwiO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmlsbEdhcE1ldGhvZCA9PT0gJ3dpZHRoJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLndpZHRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdtYXgtd2lkdGgnKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUubWF4V2lkdGggPSBcIlwiO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmlsbEdhcE1ldGhvZCA9PT0gJ3BhZGRpbmcnKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBvblJlc2l6ZSA9IGZ1bmN0aW9uIG9uUmVzaXplKGUpIHtcbiAgcmVmaWxsR2FwcygpO1xufTtcblxudmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICBzdGF0ZS5zdGFydFRvdWNoWCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfb25Ub3VjaE1vdmUgPSBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgdmFyIHN0YXJ0VG91Y2hZID0gc3RhdGUuc3RhcnRUb3VjaFksXG4gICAgICAgIHN0YXJ0VG91Y2hYID0gc3RhdGUuc3RhcnRUb3VjaFg7XG4gICAgdmFyIGN1cnJlbnRDbGllbnRZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgdmFyIGN1cnJlbnRDbGllbnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFycmF5QXNTZWxlY3RvcihzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzKTtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSB7XG4gICAgICAgIHVwOiBzdGFydFRvdWNoWSA8IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBkb3duOiBzdGFydFRvdWNoWSA+IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBsZWZ0OiBzdGFydFRvdWNoWCA8IGN1cnJlbnRDbGllbnRYLFxuICAgICAgICByaWdodDogc3RhcnRUb3VjaFggPiBjdXJyZW50Q2xpZW50WFxuICAgICAgfTtcbiAgICAgIHZhciBkaXJlY3Rpb25XaXRoT2Zmc2V0ID0ge1xuICAgICAgICB1cDogc3RhcnRUb3VjaFkgKyBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA8IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBkb3duOiBzdGFydFRvdWNoWSAtIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUID4gY3VycmVudENsaWVudFksXG4gICAgICAgIGxlZnQ6IHN0YXJ0VG91Y2hYICsgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPCBjdXJyZW50Q2xpZW50WCxcbiAgICAgICAgcmlnaHQ6IHN0YXJ0VG91Y2hYIC0gVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPiBjdXJyZW50Q2xpZW50WFxuICAgICAgfTtcblxuICAgICAgdmFyIGhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZSgkZWwpIHtcbiAgICAgICAgdmFyIHNraXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgICAgIGlmICgkZWwpIHtcbiAgICAgICAgICB2YXIgcGFyZW50U2Nyb2xsYWJsZUVsID0gZmluZFBhcmVudEJ5U2VsZWN0b3IoJGVsLCBzZWxlY3RvciwgZmFsc2UpO1xuXG4gICAgICAgICAgaWYgKGVsZW1lbnRJc0lucHV0UmFuZ2UoJGVsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChza2lwIHx8IGVsZW1lbnRJc1Njcm9sbGFibGVGaWVsZCgkZWwpICYmIGZpbmRQYXJlbnRCeVNlbGVjdG9yKCRlbCwgc2VsZWN0b3IpIHx8IGVsZW1lbnRIYXNTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgdmFyIHByZXZlbnQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uLnVwICYmIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uLmRvd24gJiYgZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpICYmIGVsZW1lbnRTY3JvbGxUb3BPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24ubGVmdCAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uU3RhcnQoJGVsKSB8fCBkaXJlY3Rpb24ucmlnaHQgJiYgZWxlbWVudFNjcm9sbExlZnRPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uV2l0aE9mZnNldC51cCAmJiBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbldpdGhPZmZzZXQuZG93biAmJiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSB8fCBkaXJlY3Rpb25XaXRoT2Zmc2V0LmxlZnQgJiYgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uV2l0aE9mZnNldC5yaWdodCAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcmV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChwYXJlbnRTY3JvbGxhYmxlRWwpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUocGFyZW50U2Nyb2xsYWJsZUVsLCB0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZShwYXJlbnRTY3JvbGxhYmxlRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGUoZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKGUpIHtcbiAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICBzdGF0ZS5zdGFydFRvdWNoWSA9IDA7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFggPSAwO1xuICB9XG59O1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTtcbn1cblxuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNjcm9sbF9sb2NrX29uVG91Y2hNb3ZlLCB7XG4gICAgcGFzc2l2ZTogZmFsc2VcbiAgfSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG59XG5cbnZhciBkZXByZWNhdGVkTWV0aG9kcyA9IHtcbiAgaGlkZTogZnVuY3Rpb24gaGlkZSh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcImhpZGVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJkaXNhYmxlUGFnZVNjcm9sbFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNkaXNhYmxlcGFnZXNjcm9sbHNjcm9sbGFibGV0YXJnZXQnKTtcbiAgICBkaXNhYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICB9LFxuICBzaG93OiBmdW5jdGlvbiBzaG93KHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2hvd1wiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImVuYWJsZVBhZ2VTY3JvbGxcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjZW5hYmxlcGFnZXNjcm9sbHNjcm9sbGFibGV0YXJnZXQnKTtcbiAgICBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCk7XG4gIH0sXG4gIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1widG9nZ2xlXCIgaXMgZGVwcmVjYXRlZCEgRG8gbm90IHVzZSBpdC4nKTtcblxuICAgIGlmIChnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBkaXNhYmxlUGFnZVNjcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCk7XG4gICAgfVxuICB9LFxuICBnZXRTdGF0ZTogZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRTdGF0ZVwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImdldFNjcm9sbFN0YXRlXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2dldHNjcm9sbHN0YXRlJyk7XG4gICAgcmV0dXJuIGdldFNjcm9sbFN0YXRlKCk7XG4gIH0sXG4gIGdldFdpZHRoOiBmdW5jdGlvbiBnZXRXaWR0aCgpIHtcbiAgICB0aHJvd0Vycm9yKCdcImdldFdpZHRoXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZ2V0UGFnZVNjcm9sbEJhcldpZHRoXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2dldHBhZ2VzY3JvbGxiYXJ3aWR0aCcpO1xuICAgIHJldHVybiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgoKTtcbiAgfSxcbiAgZ2V0Q3VycmVudFdpZHRoOiBmdW5jdGlvbiBnZXRDdXJyZW50V2lkdGgoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRDdXJyZW50V2lkdGhcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2dldGN1cnJlbnRwYWdlc2Nyb2xsYmFyd2lkdGgnKTtcbiAgICByZXR1cm4gZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCgpO1xuICB9LFxuICBzZXRTY3JvbGxhYmxlVGFyZ2V0czogZnVuY3Rpb24gc2V0U2Nyb2xsYWJsZVRhcmdldHModGFyZ2V0KSB7XG4gICAgdGhyb3dFcnJvcignXCJzZXRTY3JvbGxhYmxlVGFyZ2V0c1wiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImFkZFNjcm9sbGFibGVUYXJnZXRcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjYWRkc2Nyb2xsYWJsZXRhcmdldHNjcm9sbGFibGV0YXJnZXQnKTtcbiAgICBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG4gIH0sXG4gIHNldEZpbGxHYXBTZWxlY3RvcnM6IGZ1bmN0aW9uIHNldEZpbGxHYXBTZWxlY3RvcnMoc2VsZWN0b3IpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNldEZpbGxHYXBTZWxlY3RvcnNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRGaWxsR2FwU2VsZWN0b3JcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjYWRkZmlsbGdhcHNlbGVjdG9yZmlsbGdhcHNlbGVjdG9yJyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSxcbiAgc2V0RmlsbEdhcFRhcmdldHM6IGZ1bmN0aW9uIHNldEZpbGxHYXBUYXJnZXRzKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2V0RmlsbEdhcFRhcmdldHNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRGaWxsR2FwVGFyZ2V0XCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZGZpbGxnYXB0YXJnZXRmaWxsZ2FwdGFyZ2V0Jyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCh0YXJnZXQpO1xuICB9LFxuICBjbGVhclF1ZXVlOiBmdW5jdGlvbiBjbGVhclF1ZXVlKCkge1xuICAgIHRocm93RXJyb3IoJ1wiY2xlYXJRdWV1ZVwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImNsZWFyUXVldWVTY3JvbGxMb2Nrc1wiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNjbGVhcnF1ZXVlc2Nyb2xsbG9ja3MnKTtcbiAgICBjbGVhclF1ZXVlU2Nyb2xsTG9ja3MoKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbExvY2sgPSBfb2JqZWN0U3ByZWFkKHtcbiAgZGlzYWJsZVBhZ2VTY3JvbGw6IGRpc2FibGVQYWdlU2Nyb2xsLFxuICBlbmFibGVQYWdlU2Nyb2xsOiBlbmFibGVQYWdlU2Nyb2xsLFxuICBnZXRTY3JvbGxTdGF0ZTogZ2V0U2Nyb2xsU3RhdGUsXG4gIGNsZWFyUXVldWVTY3JvbGxMb2NrczogY2xlYXJRdWV1ZVNjcm9sbExvY2tzLFxuICBnZXRUYXJnZXRTY3JvbGxCYXJXaWR0aDogc2Nyb2xsX2xvY2tfZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGgsXG4gIGdldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aDogc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoLFxuICBnZXRQYWdlU2Nyb2xsQmFyV2lkdGg6IGdldFBhZ2VTY3JvbGxCYXJXaWR0aCxcbiAgZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aDogZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCxcbiAgYWRkU2Nyb2xsYWJsZVNlbGVjdG9yOiBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlU2VsZWN0b3IsXG4gIHJlbW92ZVNjcm9sbGFibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yLFxuICBhZGRTY3JvbGxhYmxlVGFyZ2V0OiBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0LFxuICByZW1vdmVTY3JvbGxhYmxlVGFyZ2V0OiBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0LFxuICBhZGRMb2NrYWJsZVNlbGVjdG9yOiBzY3JvbGxfbG9ja19hZGRMb2NrYWJsZVNlbGVjdG9yLFxuICBhZGRMb2NrYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVUYXJnZXQsXG4gIGFkZEZpbGxHYXBTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yLFxuICByZW1vdmVGaWxsR2FwU2VsZWN0b3I6IHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvcixcbiAgYWRkRmlsbEdhcFRhcmdldDogc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCxcbiAgcmVtb3ZlRmlsbEdhcFRhcmdldDogc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFRhcmdldCxcbiAgc2V0RmlsbEdhcE1ldGhvZDogc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZCxcbiAgcmVmaWxsR2FwczogcmVmaWxsR2FwcyxcbiAgX3N0YXRlOiBzdGF0ZVxufSwgZGVwcmVjYXRlZE1ldGhvZHMpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzY3JvbGxfbG9jayA9IF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHNjcm9sbExvY2spO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSlbXCJkZWZhdWx0XCJdO1xufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSxRQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/scroll-lock/dist/scroll-lock.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/unidragger/unidragger.js":
+/*!***********************************************!*\
+ !*** ./node_modules/unidragger/unidragger.js ***!
+ \***********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Unidragger v2.3.1\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! unipointer/unipointer */ \"./node_modules/unipointer/unipointer.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Unipointer ) {\n return factory( window, Unipointer );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdW5pZHJhZ2dlci91bmlkcmFnZ2VyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy91bmlkcmFnZ2VyL3VuaWRyYWdnZXIuanM/ZWY2MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFVuaWRyYWdnZXIgdjIuMy4xXG4gKiBEcmFnZ2FibGUgYmFzZSBjbGFzc1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ3VuaXBvaW50ZXIvdW5pcG9pbnRlcidcbiAgICBdLCBmdW5jdGlvbiggVW5pcG9pbnRlciApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIFVuaXBvaW50ZXIgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ3VuaXBvaW50ZXInKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuVW5pZHJhZ2dlciA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuVW5pcG9pbnRlclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIFVuaXBvaW50ZXIgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVW5pZHJhZ2dlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBVbmlkcmFnZ2VyKCkge31cblxuLy8gaW5oZXJpdCBVbmlwb2ludGVyICYgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBVbmlkcmFnZ2VyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFVuaXBvaW50ZXIucHJvdG90eXBlICk7XG5cbi8vIC0tLS0tIGJpbmQgc3RhcnQgLS0tLS0gLy9cblxucHJvdG8uYmluZEhhbmRsZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fYmluZEhhbmRsZXMoIHRydWUgKTtcbn07XG5cbnByb3RvLnVuYmluZEhhbmRsZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fYmluZEhhbmRsZXMoIGZhbHNlICk7XG59O1xuXG4vKipcbiAqIEFkZCBvciByZW1vdmUgc3RhcnQgZXZlbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBZGRcbiAqL1xucHJvdG8uX2JpbmRIYW5kbGVzID0gZnVuY3Rpb24oIGlzQWRkICkge1xuICAvLyBtdW5nZSBpc0FkZCwgZGVmYXVsdCB0byB0cnVlXG4gIGlzQWRkID0gaXNBZGQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBpc0FkZDtcbiAgLy8gYmluZCBlYWNoIGhhbmRsZVxuICB2YXIgYmluZE1ldGhvZCA9IGlzQWRkID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuICB2YXIgdG91Y2hBY3Rpb24gPSBpc0FkZCA/IHRoaXMuX3RvdWNoQWN0aW9uVmFsdWUgOiAnJztcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuaGFuZGxlcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgaGFuZGxlID0gdGhpcy5oYW5kbGVzW2ldO1xuICAgIHRoaXMuX2JpbmRTdGFydEV2ZW50KCBoYW5kbGUsIGlzQWRkICk7XG4gICAgaGFuZGxlWyBiaW5kTWV0aG9kIF0oICdjbGljaycsIHRoaXMgKTtcbiAgICAvLyB0b3VjaC1hY3Rpb246IG5vbmUgdG8gb3ZlcnJpZGUgYnJvd3NlciB0b3VjaCBnZXN0dXJlcy4gbWV0YWZpenp5L2ZsaWNraXR5IzU0MFxuICAgIGlmICggd2luZG93LlBvaW50ZXJFdmVudCApIHtcbiAgICAgIGhhbmRsZS5zdHlsZS50b3VjaEFjdGlvbiA9IHRvdWNoQWN0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLy8gcHJvdG90eXBlIHNvIGl0IGNhbiBiZSBvdmVyd3JpdGVhYmxlIGJ5IEZsaWNraXR5XG5wcm90by5fdG91Y2hBY3Rpb25WYWx1ZSA9ICdub25lJztcblxuLy8gLS0tLS0gc3RhcnQgZXZlbnQgLS0tLS0gLy9cblxuLyoqXG4gKiBwb2ludGVyIHN0YXJ0XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIGlzT2theSA9IHRoaXMub2theVBvaW50ZXJEb3duKCBldmVudCApO1xuICBpZiAoICFpc09rYXkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHRyYWNrIHN0YXJ0IGV2ZW50IHBvc2l0aW9uXG4gIC8vIFNhZmFyaSA5IG92ZXJyaWRlcyBwYWdlWCBhbmQgcGFnZVkuIFRoZXNlIHZhbHVlcyBuZWVkcyB0byBiZSBjb3BpZWQuIGZsaWNraXR5Izg0MlxuICB0aGlzLnBvaW50ZXJEb3duUG9pbnRlciA9IHtcbiAgICBwYWdlWDogcG9pbnRlci5wYWdlWCxcbiAgICBwYWdlWTogcG9pbnRlci5wYWdlWSxcbiAgfTtcblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB0aGlzLnBvaW50ZXJEb3duQmx1cigpO1xuICAvLyBiaW5kIG1vdmUgYW5kIGVuZCBldmVudHNcbiAgdGhpcy5fYmluZFBvc3RTdGFydEV2ZW50cyggZXZlbnQgKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyRG93bicsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gbm9kZXMgdGhhdCBoYXZlIHRleHQgZmllbGRzXG52YXIgY3Vyc29yTm9kZXMgPSB7XG4gIFRFWFRBUkVBOiB0cnVlLFxuICBJTlBVVDogdHJ1ZSxcbiAgU0VMRUNUOiB0cnVlLFxuICBPUFRJT046IHRydWUsXG59O1xuXG4vLyBpbnB1dCB0eXBlcyB0aGF0IGRvIG5vdCBoYXZlIHRleHQgZmllbGRzXG52YXIgY2xpY2tUeXBlcyA9IHtcbiAgcmFkaW86IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBidXR0b246IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGZpbGU6IHRydWUsXG59O1xuXG4vLyBkaXNtaXNzIGlucHV0cyB3aXRoIHRleHQgZmllbGRzLiBmbGlja2l0eSM0MDMsIGZsaWNraXR5IzQwNFxucHJvdG8ub2theVBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgaXNDdXJzb3JOb2RlID0gY3Vyc29yTm9kZXNbIGV2ZW50LnRhcmdldC5ub2RlTmFtZSBdO1xuICB2YXIgaXNDbGlja1R5cGUgPSBjbGlja1R5cGVzWyBldmVudC50YXJnZXQudHlwZSBdO1xuICB2YXIgaXNPa2F5ID0gIWlzQ3Vyc29yTm9kZSB8fCBpc0NsaWNrVHlwZTtcbiAgaWYgKCAhaXNPa2F5ICkge1xuICAgIHRoaXMuX3BvaW50ZXJSZXNldCgpO1xuICB9XG4gIHJldHVybiBpc09rYXk7XG59O1xuXG4vLyBrbHVkZ2UgdG8gYmx1ciBwcmV2aW91c2x5IGZvY3VzZWQgaW5wdXRcbnByb3RvLnBvaW50ZXJEb3duQmx1ciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIC8vIGRvIG5vdCBibHVyIGJvZHkgZm9yIElFMTAsIG1ldGFmaXp6eS9mbGlja2l0eSMxMTdcbiAgdmFyIGNhbkJsdXIgPSBmb2N1c2VkICYmIGZvY3VzZWQuYmx1ciAmJiBmb2N1c2VkICE9IGRvY3VtZW50LmJvZHk7XG4gIGlmICggY2FuQmx1ciApIHtcbiAgICBmb2N1c2VkLmJsdXIoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gbW92ZSBldmVudCAtLS0tLSAvL1xuXG4vKipcbiAqIGRyYWcgbW92ZVxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqL1xucHJvdG8ucG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHZhciBtb3ZlVmVjdG9yID0gdGhpcy5fZHJhZ1BvaW50ZXJNb3ZlKCBldmVudCwgcG9pbnRlciApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJNb3ZlJywgWyBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG4gIHRoaXMuX2RyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxuLy8gYmFzZSBwb2ludGVyIG1vdmUgbG9naWNcbnByb3RvLl9kcmFnUG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHZhciBtb3ZlVmVjdG9yID0ge1xuICAgIHg6IHBvaW50ZXIucGFnZVggLSB0aGlzLnBvaW50ZXJEb3duUG9pbnRlci5wYWdlWCxcbiAgICB5OiBwb2ludGVyLnBhZ2VZIC0gdGhpcy5wb2ludGVyRG93blBvaW50ZXIucGFnZVlcbiAgfTtcbiAgLy8gc3RhcnQgZHJhZyBpZiBwb2ludGVyIGhhcyBtb3ZlZCBmYXIgZW5vdWdoIHRvIHN0YXJ0IGRyYWdcbiAgaWYgKCAhdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuaGFzRHJhZ1N0YXJ0ZWQoIG1vdmVWZWN0b3IgKSApIHtcbiAgICB0aGlzLl9kcmFnU3RhcnQoIGV2ZW50LCBwb2ludGVyICk7XG4gIH1cbiAgcmV0dXJuIG1vdmVWZWN0b3I7XG59O1xuXG4vLyBjb25kaXRpb24gaWYgcG9pbnRlciBoYXMgbW92ZWQgZmFyIGVub3VnaCB0byBzdGFydCBkcmFnXG5wcm90by5oYXNEcmFnU3RhcnRlZCA9IGZ1bmN0aW9uKCBtb3ZlVmVjdG9yICkge1xuICByZXR1cm4gTWF0aC5hYnMoIG1vdmVWZWN0b3IueCApID4gMyB8fCBNYXRoLmFicyggbW92ZVZlY3Rvci55ICkgPiAzO1xufTtcblxuLy8gLS0tLS0gZW5kIGV2ZW50IC0tLS0tIC8vXG5cbi8qKlxuICogcG9pbnRlciB1cFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqL1xucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJVcCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xuICB0aGlzLl9kcmFnUG9pbnRlclVwKCBldmVudCwgcG9pbnRlciApO1xufTtcblxucHJvdG8uX2RyYWdQb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHRoaXMuX2RyYWdFbmQoIGV2ZW50LCBwb2ludGVyICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcG9pbnRlciBkaWRuJ3QgbW92ZSBlbm91Z2ggZm9yIGRyYWcgdG8gc3RhcnRcbiAgICB0aGlzLl9zdGF0aWNDbGljayggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZHJhZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBkcmFnU3RhcnRcbnByb3RvLl9kcmFnU3RhcnQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gIC8vIHByZXZlbnQgY2xpY2tzXG4gIHRoaXMuaXNQcmV2ZW50aW5nQ2xpY2tzID0gdHJ1ZTtcbiAgdGhpcy5kcmFnU3RhcnQoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5kcmFnU3RhcnQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAnZHJhZ1N0YXJ0JywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBkcmFnTW92ZVxucHJvdG8uX2RyYWdNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICkge1xuICAvLyBkbyBub3QgZHJhZyBpZiBub3QgZHJhZ2dpbmcgeWV0XG4gIGlmICggIXRoaXMuaXNEcmFnZ2luZyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmRyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxucHJvdG8uZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMuZW1pdEV2ZW50KCAnZHJhZ01vdmUnLCBbIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbn07XG5cbi8vIGRyYWdFbmRcbnByb3RvLl9kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBzZXQgZmxhZ3NcbiAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gIC8vIHJlLWVuYWJsZSBjbGlja2luZyBhc3luY1xuICBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpcy5pc1ByZXZlbnRpbmdDbGlja3M7XG4gIH0uYmluZCggdGhpcyApICk7XG5cbiAgdGhpcy5kcmFnRW5kKCBldmVudCwgcG9pbnRlciApO1xufTtcblxucHJvdG8uZHJhZ0VuZCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnRW5kJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBvbmNsaWNrIC0tLS0tIC8vXG5cbi8vIGhhbmRsZSBhbGwgY2xpY2tzIGFuZCBwcmV2ZW50IGNsaWNrcyB3aGVuIGRyYWdnaW5nXG5wcm90by5vbmNsaWNrID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICBpZiAoIHRoaXMuaXNQcmV2ZW50aW5nQ2xpY2tzICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIHN0YXRpY0NsaWNrIC0tLS0tIC8vXG5cbi8vIHRyaWdnZXJlZCBhZnRlciBwb2ludGVyIGRvd24gJiB1cCB3aXRoIG5vL3RpbnkgbW92ZW1lbnRcbnByb3RvLl9zdGF0aWNDbGljayA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgLy8gaWdub3JlIGVtdWxhdGVkIG1vdXNlIHVwIGNsaWNrc1xuICBpZiAoIHRoaXMuaXNJZ25vcmluZ01vdXNlVXAgJiYgZXZlbnQudHlwZSA9PSAnbW91c2V1cCcgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5zdGF0aWNDbGljayggZXZlbnQsIHBvaW50ZXIgKTtcblxuICAvLyBzZXQgZmxhZyBmb3IgZW11bGF0ZWQgY2xpY2tzIDMwMG1zIGFmdGVyIHRvdWNoZW5kXG4gIGlmICggZXZlbnQudHlwZSAhPSAnbW91c2V1cCcgKSB7XG4gICAgdGhpcy5pc0lnbm9yaW5nTW91c2VVcCA9IHRydWU7XG4gICAgLy8gcmVzZXQgZmxhZyBhZnRlciAzMDBtc1xuICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgZGVsZXRlIHRoaXMuaXNJZ25vcmluZ01vdXNlVXA7XG4gICAgfS5iaW5kKCB0aGlzICksIDQwMCApO1xuICB9XG59O1xuXG5wcm90by5zdGF0aWNDbGljayA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdzdGF0aWNDbGljaycsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gdXRpbHMgLS0tLS0gLy9cblxuVW5pZHJhZ2dlci5nZXRQb2ludGVyUG9pbnQgPSBVbmlwb2ludGVyLmdldFBvaW50ZXJQb2ludDtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBVbmlkcmFnZ2VyO1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/unidragger/unidragger.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/unipointer/unipointer.js":
+/*!***********************************************!*\
+ !*** ./node_modules/unipointer/unipointer.js ***!
+ \***********************************************/
+/***/ ((module, exports, __webpack_require__) => {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\")\n ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter ) {\n return factory( window, EvEmitter );\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n\n this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n\n delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdW5pcG9pbnRlci91bmlwb2ludGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy91bmlwb2ludGVyL3VuaXBvaW50ZXIuanM/ZTBmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFVuaXBvaW50ZXIgdjIuMy4wXG4gKiBiYXNlIGNsYXNzIGZvciBkb2luZyBvbmUgdGhpbmcgd2l0aCBwb2ludGVyIGV2ZW50XG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHN0cmljdDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbCBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcidcbiAgICBdLCBmdW5jdGlvbiggRXZFbWl0dGVyICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LlVuaXBvaW50ZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkV2RW1pdHRlclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gVW5pcG9pbnRlcigpIHt9XG5cbi8vIGluaGVyaXQgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBVbmlwb2ludGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxucHJvdG8uYmluZFN0YXJ0RXZlbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGVsZW0sIHRydWUgKTtcbn07XG5cbnByb3RvLnVuYmluZFN0YXJ0RXZlbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGVsZW0sIGZhbHNlICk7XG59O1xuXG4vKipcbiAqIEFkZCBvciByZW1vdmUgc3RhcnQgZXZlbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBZGQgLSByZW1vdmUgaWYgZmFsc2V5XG4gKi9cbnByb3RvLl9iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCBpc0FkZCApIHtcbiAgLy8gbXVuZ2UgaXNBZGQsIGRlZmF1bHQgdG8gdHJ1ZVxuICBpc0FkZCA9IGlzQWRkID09PSB1bmRlZmluZWQgPyB0cnVlIDogaXNBZGQ7XG4gIHZhciBiaW5kTWV0aG9kID0gaXNBZGQgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cbiAgLy8gZGVmYXVsdCB0byBtb3VzZSBldmVudHNcbiAgdmFyIHN0YXJ0RXZlbnQgPSAnbW91c2Vkb3duJztcbiAgaWYgKCB3aW5kb3cuUG9pbnRlckV2ZW50ICkge1xuICAgIC8vIFBvaW50ZXIgRXZlbnRzXG4gICAgc3RhcnRFdmVudCA9ICdwb2ludGVyZG93bic7XG4gIH0gZWxzZSBpZiAoICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyApIHtcbiAgICAvLyBUb3VjaCBFdmVudHMuIGlPUyBTYWZhcmlcbiAgICBzdGFydEV2ZW50ID0gJ3RvdWNoc3RhcnQnO1xuICB9XG4gIGVsZW1bIGJpbmRNZXRob2QgXSggc3RhcnRFdmVudCwgdGhpcyApO1xufTtcblxuLy8gdHJpZ2dlciBoYW5kbGVyIG1ldGhvZHMgZm9yIGV2ZW50c1xucHJvdG8uaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gcmV0dXJucyB0aGUgdG91Y2ggdGhhdCB3ZSdyZSBrZWVwaW5nIHRyYWNrIG9mXG5wcm90by5nZXRUb3VjaCA9IGZ1bmN0aW9uKCB0b3VjaGVzICkge1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgdG91Y2ggPSB0b3VjaGVzW2ldO1xuICAgIGlmICggdG91Y2guaWRlbnRpZmllciA9PSB0aGlzLnBvaW50ZXJJZGVudGlmaWVyICkge1xuICAgICAgcmV0dXJuIHRvdWNoO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0gc3RhcnQgZXZlbnQgLS0tLS0gLy9cblxucHJvdG8ub25tb3VzZWRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIC8vIGRpc21pc3MgY2xpY2tzIGZyb20gcmlnaHQgb3IgbWlkZGxlIGJ1dHRvbnNcbiAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcbiAgaWYgKCBidXR0b24gJiYgKCBidXR0b24gIT09IDAgJiYgYnV0dG9uICE9PSAxICkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbnByb3RvLm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlckRvd24oIGV2ZW50LCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSApO1xufTtcblxucHJvdG8ub25wb2ludGVyZG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlckRvd24oIGV2ZW50LCBldmVudCApO1xufTtcblxuLyoqXG4gKiBwb2ludGVyIHN0YXJ0XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5fcG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIGRpc21pc3MgcmlnaHQgY2xpY2sgYW5kIG90aGVyIHBvaW50ZXJzXG4gIC8vIGJ1dHRvbiA9IDAgaXMgb2theSwgMS00IG5vdFxuICBpZiAoIGV2ZW50LmJ1dHRvbiB8fCB0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5pc1BvaW50ZXJEb3duID0gdHJ1ZTtcbiAgLy8gc2F2ZSBwb2ludGVyIGlkZW50aWZpZXIgdG8gbWF0Y2ggdXAgdG91Y2ggZXZlbnRzXG4gIHRoaXMucG9pbnRlcklkZW50aWZpZXIgPSBwb2ludGVyLnBvaW50ZXJJZCAhPT0gdW5kZWZpbmVkID9cbiAgICAvLyBwb2ludGVySWQgZm9yIHBvaW50ZXIgZXZlbnRzLCB0b3VjaC5pbmRlbnRpZmllciBmb3IgdG91Y2ggZXZlbnRzXG4gICAgcG9pbnRlci5wb2ludGVySWQgOiBwb2ludGVyLmlkZW50aWZpZXI7XG5cbiAgdGhpcy5wb2ludGVyRG93biggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJEb3duJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBoYXNoIG9mIGV2ZW50cyB0byBiZSBib3VuZCBhZnRlciBzdGFydCBldmVudFxudmFyIHBvc3RTdGFydEV2ZW50cyA9IHtcbiAgbW91c2Vkb3duOiBbICdtb3VzZW1vdmUnLCAnbW91c2V1cCcgXSxcbiAgdG91Y2hzdGFydDogWyAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3RvdWNoY2FuY2VsJyBdLFxuICBwb2ludGVyZG93bjogWyAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJjYW5jZWwnIF0sXG59O1xuXG5wcm90by5fYmluZFBvc3RTdGFydEV2ZW50cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCAhZXZlbnQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCBwcm9wZXIgZXZlbnRzIHRvIG1hdGNoIHN0YXJ0IGV2ZW50XG4gIHZhciBldmVudHMgPSBwb3N0U3RhcnRFdmVudHNbIGV2ZW50LnR5cGUgXTtcbiAgLy8gYmluZCBldmVudHMgdG8gbm9kZVxuICBldmVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCB0aGlzICk7XG4gIH0sIHRoaXMgKTtcbiAgLy8gc2F2ZSB0aGVzZSBhcmd1bWVudHNcbiAgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzID0gZXZlbnRzO1xufTtcblxucHJvdG8uX3VuYmluZFBvc3RTdGFydEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBmb3IgX2JvdW5kRXZlbnRzLCBpbiBjYXNlIGRyYWdFbmQgdHJpZ2dlcmVkIHR3aWNlIChvbGQgSUU4IGJ1ZylcbiAgaWYgKCAhdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9ib3VuZFBvaW50ZXJFdmVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCB0aGlzICk7XG4gIH0sIHRoaXMgKTtcblxuICBkZWxldGUgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzO1xufTtcblxuLy8gLS0tLS0gbW92ZSBldmVudCAtLS0tLSAvL1xuXG5wcm90by5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlck1vdmUoIGV2ZW50LCBldmVudCApO1xufTtcblxucHJvdG8ub25wb2ludGVybW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyTW92ZSggZXZlbnQsIGV2ZW50ICk7XG4gIH1cbn07XG5cbnByb3RvLm9udG91Y2htb3ZlID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJNb3ZlKCBldmVudCwgdG91Y2ggKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwb2ludGVyIG1vdmVcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fcG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMucG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG4vLyBwdWJsaWNcbnByb3RvLnBvaW50ZXJNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJNb3ZlJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBlbmQgZXZlbnQgLS0tLS0gLy9cblxuXG5wcm90by5vbm1vdXNldXAgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJVcCggZXZlbnQsIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbnBvaW50ZXJ1cCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNoZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJVcCggZXZlbnQsIHRvdWNoICk7XG4gIH1cbn07XG5cbi8qKlxuICogcG9pbnRlciB1cFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIHRoaXMucG9pbnRlclVwKCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gcHVibGljXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlclVwJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBwb2ludGVyIGRvbmUgLS0tLS0gLy9cblxuLy8gdHJpZ2dlcmVkIG9uIHBvaW50ZXIgdXAgJiBwb2ludGVyIGNhbmNlbFxucHJvdG8uX3BvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3BvaW50ZXJSZXNldCgpO1xuICB0aGlzLl91bmJpbmRQb3N0U3RhcnRFdmVudHMoKTtcbiAgdGhpcy5wb2ludGVyRG9uZSgpO1xufTtcblxucHJvdG8uX3BvaW50ZXJSZXNldCA9IGZ1bmN0aW9uKCkge1xuICAvLyByZXNldCBwcm9wZXJ0aWVzXG4gIHRoaXMuaXNQb2ludGVyRG93biA9IGZhbHNlO1xuICBkZWxldGUgdGhpcy5wb2ludGVySWRlbnRpZmllcjtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gbm9vcDtcblxuLy8gLS0tLS0gcG9pbnRlciBjYW5jZWwgLS0tLS0gLy9cblxucHJvdG8ub25wb2ludGVyY2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LnBvaW50ZXJJZCA9PSB0aGlzLnBvaW50ZXJJZGVudGlmaWVyICkge1xuICAgIHRoaXMuX3BvaW50ZXJDYW5jZWwoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNoY2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJDYW5jZWwoIGV2ZW50LCB0b3VjaCApO1xuICB9XG59O1xuXG4vKipcbiAqIHBvaW50ZXIgY2FuY2VsXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICogQHByaXZhdGVcbiAqL1xucHJvdG8uX3BvaW50ZXJDYW5jZWwgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIHRoaXMucG9pbnRlckNhbmNlbCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbi8vIHB1YmxpY1xucHJvdG8ucG9pbnRlckNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyQ2FuY2VsJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuLy8gdXRpbGl0eSBmdW5jdGlvbiBmb3IgZ2V0dGluZyB4L3kgY29vcmRzIGZyb20gZXZlbnRcblVuaXBvaW50ZXIuZ2V0UG9pbnRlclBvaW50ID0gZnVuY3Rpb24oIHBvaW50ZXIgKSB7XG4gIHJldHVybiB7XG4gICAgeDogcG9pbnRlci5wYWdlWCxcbiAgICB5OiBwb2ludGVyLnBhZ2VZXG4gIH07XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIFVuaXBvaW50ZXI7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/unipointer/unipointer.js\n");
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ if(__webpack_module_cache__[moduleId]) {
+/******/ return __webpack_module_cache__[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ (() => {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = (module) => {
+/******/ var getter = module && module.__esModule ?
+/******/ () => (module['default']) :
+/******/ () => (module);
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/global */
+/******/ (() => {
+/******/ __webpack_require__.g = (function() {
+/******/ if (typeof globalThis === 'object') return globalThis;
+/******/ try {
+/******/ return this || new Function('return this')();
+/******/ } catch (e) {
+/******/ if (typeof window === 'object') return window;
+/******/ }
+/******/ })();
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ (() => {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = (exports) => {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ })();
+/******/
+/************************************************************************/
+/******/ // startup
+/******/ // Load entry module
+/******/ __webpack_require__("./source/scripts/grid.js");
+/******/ // This entry module used 'exports' so it can't be inlined
+/******/ })()
+;
\ No newline at end of file
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/config_settings_schema.json.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/config_settings_schema.json.pushbak
new file mode 100644
index 00000000..8e8d30a5
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/config_settings_schema.json.pushbak
@@ -0,0 +1,549 @@
+[
+ {
+ "name": "theme_info",
+ "theme_name": "Grid",
+ "theme_author": "Pixel Union",
+ "theme_version": "7.1.0",
+ "theme_documentation_url": "https:\/\/support.pixelunion.net\/hc\/en-us\/sections\/360003950473-Grid",
+ "theme_support_url": "https:\/\/support.pixelunion.net\/hc\/en-us\/requests\/new"
+ },
+ {
+ "name": "Collection hero",
+ "settings": [
+ {
+ "type": "paragraph",
+ "content": "Collection-page hero band. Per-collection Collection images always take priority (frame 1). When 'Rotate newest arrivals' is on, the newest store-wide products follow as a crossfade slideshow."
+ },
+ {
+ "type": "image_picker",
+ "id": "collection_default_hero",
+ "label": "Default collection hero image",
+ "info": "Used only when a collection has no image of its own. Recommended 2000x600."
+ },
+ {
+ "type": "checkbox",
+ "id": "collection_hero_rotate",
+ "label": "Rotate newest arrivals in the hero",
+ "default": true,
+ "info": "Crossfades through the newest store-wide products (from the New Arrivals collection). Off = show only the curated\/default image."
+ }
+ ]
+ },
+ {
+ "name": "Favicon",
+ "settings": [
+ {
+ "type": "image_picker",
+ "id": "favicon",
+ "label": "Favicon"
+ }
+ ]
+ },
+ {
+ "name": "t:settings_schema.age_gate.name",
+ "settings": [
+ {
+ "type": "checkbox",
+ "id": "enable_age_gate_site_wide",
+ "label": "t:settings_schema.age_gate.enable_site_wide.label",
+ "default": false
+ },
+ {
+ "type": "number",
+ "id": "age_gate_site_wide_min_age",
+ "label": "t:settings_schema.age_gate.minimum_age.label",
+ "default": 18
+ },
+ {
+ "type": "text",
+ "id": "age_gate_heading",
+ "label": "t:settings_schema.age_gate.heading.label",
+ "default": "Age Verification"
+ },
+ {
+ "type": "text",
+ "id": "age_gate_description",
+ "label": "t:settings_schema.age_gate.description.label",
+ "default": "Please enter your date of birth for full access."
+ },
+ {
+ "type": "checkbox",
+ "id": "show_age_gate_logo",
+ "label": "t:settings_schema.age_gate.show_logo.label",
+ "default": true,
+ "info": "t:settings_schema.age_gate.show_logo.info"
+ }
+ ]
+ },
+ {
+ "name": "Color",
+ "settings": [
+ {
+ "type": "header",
+ "content": "Background"
+ },
+ {
+ "type": "color",
+ "id": "background-color",
+ "label": "Background"
+ },
+ {
+ "type": "image_picker",
+ "id": "body-background-image",
+ "label": "Background image",
+ "info": "200 x 200px recommended"
+ },
+ {
+ "type": "header",
+ "content": "General"
+ },
+ {
+ "type": "color",
+ "id": "body-text-color",
+ "label": "Text"
+ },
+ {
+ "type": "color",
+ "id": "accent-color",
+ "label": "Accent"
+ },
+ {
+ "type": "color",
+ "id": "heading-color",
+ "label": "Heading"
+ },
+ {
+ "type": "color",
+ "id": "meta-color",
+ "label": "Meta text"
+ },
+ {
+ "type": "color",
+ "id": "border-color",
+ "label": "Border"
+ },
+ {
+ "type": "color",
+ "id": "product-badge-background-color",
+ "label": "Sale\/sold out badges and discounts"
+ },
+ {
+ "type": "header",
+ "content": "Buttons"
+ },
+ {
+ "type": "color",
+ "id": "button-color",
+ "label": "Primary button text"
+ },
+ {
+ "type": "color",
+ "id": "secondary-button-background",
+ "label": "Secondary button background"
+ },
+ {
+ "type": "color",
+ "id": "secondary-button-color",
+ "label": "Secondary button text"
+ },
+ {
+ "type": "header",
+ "content": "Header"
+ },
+ {
+ "type": "color",
+ "id": "header-tools-color",
+ "label": "Header tools"
+ },
+ {
+ "type": "color",
+ "id": "header-tools-background-color",
+ "label": "Header tools background"
+ },
+ {
+ "type": "color",
+ "id": "navigation-color",
+ "label": "Navigation"
+ },
+ {
+ "type": "header",
+ "content": "Dropdowns\/table headers"
+ },
+ {
+ "type": "color",
+ "id": "form-select-background",
+ "label": "Background"
+ },
+ {
+ "type": "color",
+ "id": "form-select-color",
+ "label": "Text"
+ },
+ {
+ "type": "color",
+ "id": "form-select-border-color",
+ "label": "Border",
+ "info": "This option only applies to dropdown menus."
+ }
+ ]
+ },
+ {
+ "name": "Typography",
+ "settings": [
+ {
+ "type": "select",
+ "id": "font-base-size",
+ "label": "Base size",
+ "default": "14px",
+ "options": [
+ {
+ "value": "14px",
+ "label": "Small"
+ },
+ {
+ "value": "16px",
+ "label": "Medium"
+ },
+ {
+ "value": "18px",
+ "label": "Large"
+ }
+ ]
+ },
+ {
+ "type": "font_picker",
+ "label": "Body font",
+ "id": "font_body",
+ "default": "helvetica_n4"
+ },
+ {
+ "type": "header",
+ "content": "Headings"
+ },
+ {
+ "type": "font_picker",
+ "label": "Heading font",
+ "id": "font_heading",
+ "default": "helvetica_n4"
+ },
+ {
+ "type": "checkbox",
+ "id": "heading-font-small-caps",
+ "label": "Capitalize"
+ },
+ {
+ "type": "header",
+ "content": "Navigation"
+ },
+ {
+ "type": "font_picker",
+ "label": "Navigation font",
+ "id": "font_navigation",
+ "default": "helvetica_n4"
+ },
+ {
+ "type": "checkbox",
+ "id": "navigation-font-small-caps",
+ "label": "Capitalize"
+ },
+ {
+ "type": "header",
+ "content": "Captions"
+ },
+ {
+ "type": "font_picker",
+ "label": "Caption font",
+ "id": "font_meta",
+ "default": "helvetica_n4"
+ },
+ {
+ "type": "checkbox",
+ "id": "meta-font-small-caps",
+ "label": "Capitalize"
+ },
+ {
+ "type": "header",
+ "content": "Buttons"
+ },
+ {
+ "type": "font_picker",
+ "label": "Button font",
+ "id": "font_button",
+ "default": "helvetica_n4"
+ },
+ {
+ "type": "checkbox",
+ "id": "button-font-small-caps",
+ "label": "Capitalize"
+ }
+ ]
+ },
+ {
+ "name": "Social media",
+ "settings": [
+ {
+ "type": "header",
+ "content": "Accounts"
+ },
+ {
+ "type": "text",
+ "id": "social-behance-link",
+ "label": "Behance",
+ "info": "https:\/\/behance.net\/"
+ },
+ {
+ "type": "text",
+ "id": "social-clubhouse-link",
+ "label": "Clubhouse",
+ "info": "https:\/\/www.clubhouse.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-discord-link",
+ "label": "Discord",
+ "info": "https:\/\/discord.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-dribbble-link",
+ "label": "Dribbble",
+ "info": "https:\/\/dribbble.com\/shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-email-link",
+ "label": "Email address"
+ },
+ {
+ "type": "text",
+ "id": "social-facebook-link",
+ "label": "Facebook",
+ "info": "https:\/\/www.facebook.com\/shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-flickr-link",
+ "label": "Flickr",
+ "info": "https:\/\/flickr.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-houzz-link",
+ "label": "Houzz",
+ "info": "https:\/\/www.houzz.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-instagram-link",
+ "label": "Instagram",
+ "info": "https:\/\/instagram.com\/shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-kickstarter-link",
+ "label": "Kickstarter",
+ "info": "https:\/\/www.kickstarter.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-linkedin-link",
+ "label": "LinkedIn",
+ "info": "https:\/\/www.linkedin.com\/company\/shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-medium-link",
+ "label": "Medium",
+ "info": "https:\/\/medium.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-messenger-link",
+ "label": "Messenger",
+ "info": "https:\/\/www.messenger.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-opensea-link",
+ "label": "OpenSea",
+ "info": "https:\/\/opensea.io\/"
+ },
+ {
+ "type": "text",
+ "id": "social-pinterest-link",
+ "label": "Pinterest",
+ "info": "https:\/\/www.pinterest.com\/shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-reddit-link",
+ "label": "Reddit",
+ "info": "https:\/\/www.reddit.com\/r\/shopify\/"
+ },
+ {
+ "type": "text",
+ "id": "social-rss-link",
+ "label": "RSS",
+ "info": "https:\/\/www.shopify.com\/content-services\/feeds\/ecommerce.atom"
+ },
+ {
+ "type": "text",
+ "id": "social-snapchat-link",
+ "label": "Snapchat",
+ "info": "https:\/\/www.snapchat.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-spotify-link",
+ "label": "Spotify",
+ "info": "https:\/\/www.spotify.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-tiktok-link",
+ "label": "TikTok",
+ "info": "https:\/\/tiktok.com\/@shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-tumblr-link",
+ "label": "Tumblr",
+ "info": "https:\/\/shopify.tumblr.com"
+ },
+ {
+ "type": "text",
+ "id": "social-twitch-link",
+ "label": "Twitch",
+ "info": "https:\/\/www.twitch.tv\/"
+ },
+ {
+ "type": "text",
+ "id": "social-x-link",
+ "label": "X",
+ "info": "https:\/\/x.com\/shopify"
+ },
+ {
+ "type": "text",
+ "id": "social-vimeo-link",
+ "label": "Vimeo",
+ "info": "https:\/\/vimeo.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-whatsapp-link",
+ "label": "WhatsApp",
+ "info": "https:\/\/www.whatsapp.com\/"
+ },
+ {
+ "type": "text",
+ "id": "social-youtube-link",
+ "label": "YouTube",
+ "info": "https:\/\/www.youtube.com\/user\/shopify"
+ },
+ {
+ "type": "header",
+ "content": "Sharing"
+ },
+ {
+ "type": "checkbox",
+ "id": "share-widget-facebook",
+ "label": "Share on Facebook"
+ },
+ {
+ "type": "checkbox",
+ "id": "share-widget-x",
+ "label": "Share on X"
+ },
+ {
+ "type": "checkbox",
+ "id": "share-widget-pinterest",
+ "label": "Pin on Pinterest"
+ },
+ {
+ "type": "checkbox",
+ "id": "share-widget-fancy",
+ "label": "Add to Fancy"
+ },
+ {
+ "type": "checkbox",
+ "id": "share-widget-email",
+ "label": "Enable email"
+ }
+ ]
+ },
+ {
+ "name": "Product cards",
+ "settings": [
+ {
+ "type": "select",
+ "id": "product_hover",
+ "label": "Overlay \/ hover interaction",
+ "options": [
+ {
+ "value": "quick-shop",
+ "label": "Quick shop"
+ },
+ {
+ "value": "image-flip",
+ "label": "Secondary image"
+ },
+ {
+ "value": "stock-level",
+ "label": "Stock level indicator"
+ },
+ {
+ "value": "none",
+ "label": "None"
+ }
+ ],
+ "default": "quick-shop"
+ },
+ {
+ "type": "range",
+ "id": "product_stock_level_threshold",
+ "label": "Show warning when stock is equal to or less than:",
+ "min": 1,
+ "max": 10,
+ "step": 1,
+ "default": 1
+ },
+ {
+ "type": "checkbox",
+ "id": "show_vendor",
+ "label": "Show vendor name",
+ "default": false
+ },
+ {
+ "type": "checkbox",
+ "id": "product_badges",
+ "label": "Show 'on sale' \/ 'sold out' badges",
+ "default": false
+ },
+ {
+ "type": "checkbox",
+ "id": "product_badges_icons",
+ "label": "Use icons for 'on sale' \/ 'sold out' badges",
+ "default": false
+ }
+ ]
+ },
+ {
+ "name": "DW Controls",
+ "settings": [
+ {
+ "type": "checkbox",
+ "id": "dw_enable_recently_viewed",
+ "label": "Enable Recently Viewed products section",
+ "info": "Shows a carousel of recently viewed products at the top of static pages. Toggle OFF to instantly hide.",
+ "default": true
+ },
+ {
+ "type": "checkbox",
+ "id": "dw_enable_new_metafields",
+ "label": "Enable new product metafields UI",
+ "info": "Toggle this OFF to instantly revert to the old metafields layout",
+ "default": false
+ }
+ ]
+ }
+]
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/layout_theme.liquid.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/layout_theme.liquid.pushbak
new file mode 100644
index 00000000..15d29c52
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/layout_theme.liquid.pushbak
@@ -0,0 +1,1267 @@
+{% comment %}DW-CHINA-BLOCK-START{% endcomment %}
+{% assign dw_blocked_countries = "CN" | split: "," %}
+{% assign dw_visitor_country = localization.country.iso_code | upcase %}
+{% assign dw_is_blocked = false %}
+{% for dw_bc in dw_blocked_countries %}
+ {% assign dw_bc_trimmed = dw_bc | strip %}
+ {% if dw_visitor_country == dw_bc_trimmed %}
+ {% assign dw_is_blocked = true %}
+ {% endif %}
+{% endfor %}
+
+{% if dw_is_blocked %}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<!-- DW-CHINA-JS-BLOCK-START -->
+<script>
+(function() {
+ var blockedCountries = ['CN'];
+ fetch('/browsing_context_suggestions.json', {method: 'GET', credentials: 'same-origin'})
+ .then(function(r) { return r.json(); })
+ .catch(function() { return null; })
+ .then(function(data) {
+ if (data && data.detected_values && data.detected_values.country && data.detected_values.country.handle) {
+ var detectedCountry = data.detected_values.country.handle.toUpperCase();
+ if (blockedCountries.indexOf(detectedCountry) !== -1) {
+ var container = document.createElement('div');
+ container.innerHTML = '<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:#f5f5f5;z-index:999999;display:flex;align-items:center;justify-content:center;font-family:-apple-system,BlinkMacSystemFont,sans-serif"><div style="text-align:center;padding:60px 40px;background:#fff;border-radius:12px;box-shadow:0 4px 24px rgba(0,0,0,.08);max-width:520px;width:90%"><div style="font-size:48px;margin-bottom:20px">🌐</div><h1 style="font-size:24px;margin-bottom:16px;font-weight:600;color:#333">Region Not Available</h1><p style="font-size:16px;line-height:1.6;color:#666;margin-bottom:12px">This store is not available in your region.</p><p style="font-size:16px;line-height:1.6;color:#666">We do not ship to or serve customers in your area at this time.</p></div></div>';
+ document.body.innerHTML = '';
+ document.body.appendChild(container);
+ }
+ }
+ });
+})();
+</script>
+<!-- DW-CHINA-JS-BLOCK-END -->
+
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Region Not Available</title>
+ <style>
+ * { margin: 0; padding: 0; box-sizing: border-box; }
+ body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ background: #f5f5f5;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ color: #333;
+ }
+ .container {
+ text-align: center;
+ padding: 60px 40px;
+ background: white;
+ border-radius: 12px;
+ box-shadow: 0 4px 24px rgba(0,0,0,0.08);
+ max-width: 520px;
+ width: 90%;
+ }
+ .icon { font-size: 48px; margin-bottom: 20px; }
+ h1 { font-size: 24px; margin-bottom: 16px; font-weight: 600; }
+ p { font-size: 16px; line-height: 1.6; color: #666; margin-bottom: 12px; }
+ .contact { margin-top: 24px; font-size: 14px; color: #999; }
+ .contact a { color: #2563eb; text-decoration: none; }
+ </style>
+<script src="{{ 'dw-grid-control.js' | asset_url }}" defer></script>
+
+
+
+
+
+<!-- cache-bust: 2026-03-25T00:54:55.724677 -->
+</head>
+<body>
+ <div class="container">
+ <div class="icon">🌐</div>
+ <h1>Region Not Available</h1>
+ <p>We're sorry, but this store is not available in your region.</p>
+ <p>We do not ship to or serve customers in your area at this time.</p>
+ <div class="contact">
+ Questions? Contact us at <a href="mailto:info@designerwallcoverings.com">info@designerwallcoverings.com</a>
+ </div>
+ </div>
+
+
+</body>
+</html>
+{% break %}
+{% endif %}
+{% comment %}DW-CHINA-BLOCK-END{% endcomment %}
+
+<!doctype html>
+<html
+ class="
+ no-js
+ loading
+ "
+ lang="{{ request.locale.iso_code }}"
+>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+
+ <!-- Preconnect Domains -->
+ <link rel="preconnect" href="https://cdn.shopify.com" crossorigin>
+ <link rel="preconnect" href="https://fonts.shopify.com" crossorigin>
+ <link rel="preconnect" href="https://monorail-edge.shopifysvc.com">
+
+ <!-- Preload Assets -->
+ <link rel="preload" href="{{ 'chiko-icons.woff' | asset_url }}" as="font" type="font/woff" crossorigin>
+ <link rel="preload" href="{{ 'pxu-social-icons.woff' | asset_url }}" as="font" type="font/woff" crossorigin>
+
+ <link rel="preload" href="{{ 'theme.css' | asset_url }}" as="style">
+
+ <link rel="preload" href="{{ 'modernizr-2.8.2.min.js' | asset_url }}" as="script">
+
+ {% if template contains 'cart' %}
+ <link rel="preload" href="{{ '/services/javascripts/countries.js' }}" as="script">
+ <link rel="preload" href="{{ 'shopify_common.js' | shopify_asset_url }}" as="script">
+ {% endif %}
+
+ {% if template contains 'customers' %}
+ <link rel="preload" href="{{ 'shopify_common.js' | shopify_asset_url }}" as="script">
+ <link rel="preload" href="{{ 'customer_area.js' | shopify_asset_url }}" as="script">
+ {% endif %}
+
+ <link rel="preload" href="{{ 'grid.js' | asset_url }}" as="script">
+
+ <script src="//cdata.modernpostcard.com/js/E3CA4636CEDAD4.js" async defer></script>
+
+ <title>
+ {{ page_title }}
+
+ {% if current_tags %}
+ – {{ current_tags | join: ', ' }}
+ {% endif %}
+
+ {% if current_page != 1 %}
+ – {{ 'general.pagination.page' | t: page_number: current_page }}
+ {% endif %}
+
+ {% unless page_title contains shop.name %}
+ – {{ shop.name }}
+ {% endunless %}
+ </title>
+
+ {% if page_description %}
+ <meta name="description" content="{{ page_description | escape }}" />
+ {% endif %}
+
+ {% if settings.favicon %}
+ <link rel="shortcut icon" href="{{ settings.favicon | img_url: '32x32' }}" type="image/png" />
+ {% endif %}
+
+ {% if template contains 'collection' and current_tags %}
+ <meta name="robots" content="noindex" />
+ <link rel="canonical" href="{{ shop.url }}{{ collection.url }}" />
+ {% else %}
+ <link rel="canonical" href="{{ canonical_url }}" />
+ {% endif %}
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+
+ {%- render 'head.import-map' -%}
+ {%- render 'head.is-land' -%}
+
+ {% comment %}
+ {% render 'boost-sd-fallback' %}
+ {% endcomment %}
+ {{ content_for_header }}
+
+ {% liquid
+ assign heading_text_transform = 'none'
+ if settings.heading-font-small-caps
+ assign heading_text_transform = 'uppercase'
+ endif
+
+ assign button_text_transform = 'none'
+ assign button_letter_spacing = '0em'
+ if settings.button-font-small-caps
+ assign button_text_transform = 'uppercase'
+ assign button_letter_spacing = '0.05em'
+ endif
+ %}
+
+ <style>
+ :root {
+ /* ------------------------------------------------------------
+ Typography
+ ------------------------------------------------------------ */
+ /* Body */
+ --element-text-font-size--body-lg: 1.286rem; /* Product price */
+ --element-text-font-size--body-sm: var(--text-size-3-5); /* SKU, installments, variant labels */
+ --element-text-font-family--body: {{ settings.font_body.family }}, {{ settings.font_body.fallback_families }};
+ --element-text-font-weight--body: {{ settings.font_body.weight }};
+
+ /* Headings */
+ --element-text-font-size--heading-xl: 2.5rem; /* Product title */
+ --element-text-font-family--heading: {{ settings.font_heading.family }}, {{ settings.font_heading.fallback_families }};
+ --element-text-font-weight--heading: {{ settings.font_heading.weight }};
+ --element-text-line-height--heading: 1.25;
+ --element-text-text-transform--heading: {{ heading_text_transform }};
+
+ /* Buttons */
+ --element-button-font-family: {{ settings.font_button.family }}, {{ settings.font_button.fallback_families }};
+ --element-button-text-transform: {{ button_text_transform }};
+ --element-button-letter-spacing: {{ button_letter_spacing }};
+
+ /* ------------------------------------------------------------
+ Colors
+ ------------------------------------------------------------ */
+ --color-primary: {{ settings['body-text-color'] }};
+ --color-secondary: {{ settings['background-color'] }};
+ --root-color-primary: {{ settings['body-text-color'] }};
+ --root-color-secondary: {{ settings['background-color'] }};
+ --color-focus: #0000ff;
+
+ --color-sale-tag-text: {{ settings['background-color'] }};
+ --color-sale-tag: {{ settings['product-badge-background-color'] }};
+
+ --element-button-color-primary: {{ settings['button-color'] }};
+ --element-button-color-secondary: {{ settings['accent-color'] }};
+
+ --element-text-color: {{ settings['body-text-color'] }};
+ --element-text-color--heading: {{ settings['heading-color'] }};
+
+ --element-input-color-primary: {{ settings['form-select-color'] }};
+ --element-input-color-secondary: {{ settings['form-select-background'] }};
+
+ /* ------------------------------------------------------------
+ Other
+ ------------------------------------------------------------ */
+ --element-badge-radius: 2px;
+ --element-button-radius: 2px;
+
+ --layout-section-max-inline-size: 1260px;
+ --layout-section-padding-inline: 30px;
+ }
+
+ /* ------------------------------------------------------------
+ Component overrides
+ ------------------------------------------------------------ */
+
+ ::before,
+ ::after {
+ box-sizing: content-box;
+ }
+ product-hot-reload ::before,
+ product-hot-reload ::after {
+ box-sizing: border-box;
+ }
+
+ /* Lightbox */
+ .overlay-lightbox__overlay {
+ z-index: 9999;
+ }
+
+ /* Pick up */
+ .element-icon-in-stock {
+ fill: currentColor;
+ }
+
+ /* Divider */
+ hr.element-divider {
+ height: 0;
+ background: transparent;
+ }
+
+ /* Drawer */
+ overlay-drawer .element-button {
+ --element-button-color-primary: {{ settings.body-text-color }};
+ --element-icon-stroke-width: 3px;
+ }
+
+ /* Heading */
+ .element-text:is([class*=element-text--heading]) {
+ --_color: var(--element-text-color--heading);
+ }
+
+ /* Element Input */
+ .element-input {
+ --_color-box-shadow: {{ settings['form-select-border-color'] }};
+ }
+
+ /* Variant Labels */
+ label.element-text:is([class*=element-text--body]):where(.element-text--body-sm) {
+ color: {{ settings['heading-color'] }};
+ font-size: 1rem;
+
+ .element-text:first-child {
+ color: {{ settings['heading-color'] }};
+ }
+ }
+
+ /* Element Select */
+ element-select {
+ --color-primary: {{ settings['form-select-border-color'] }};
+ --element-button-color-primary: {{ settings['form-select-color'] }};
+ --element-button-color-secondary: {{ settings['form-select-background'] }};
+ --element-button-box-shadow: inset 0 0 0 1px {{ settings['form-select-border-color'] }};
+ --element-button-font-family: {{ settings.font_body.family }}, {{ settings.font_body.fallback_families }};
+ --element-button-text-transform: none;
+ }
+ element-select.element-select__wrapper--focused .element-button {
+ box-shadow: inset 0 0 0 var(--element-button-border-width--focus) var(--_color-focus);
+ border: none;
+ }
+
+ /* Media Gallery */
+ .media-gallery__thumb {
+ border-radius: 0;
+ }
+
+ /* ATC */
+
+ product-form .element-button[type="submit"] {
+ --element-button-padding-block: var(--size-5);
+ --_color-text: {{ settings['button-color'] }};
+ --_color-background: {{ settings['accent-color'] }};
+ --_box-shadow: none;
+
+ &:disabled {
+ color: #888888 !important;
+ background-color: #cccccc !important;
+ }
+ }
+
+ product-form:has(.element-button--shopify-payment-wrapper) .element-button[type="submit"] {
+ --element-button-color-primary: {{ settings['secondary-button-color'] }};
+ --element-button-color-secondary: {{ settings['secondary-button-background'] }};
+ }
+
+ .shopify-payment-button .shopify-payment-button__button.shopify-payment-button__button--unbranded,
+ .shopify-payment-button .shopify-payment-button__button {
+ --element-text-line-height--body-md: 1;
+ --element-button-color-primary: {{ settings['accent-color'] }};
+ --element-button-color-secondary: {{ settings['button-color'] }};
+ --element-button-padding-block: var(--size-5);
+ --_box-shadow: none;
+
+ text-transform: var(--element-button-text-transform);
+ }
+ </style>
+
+ {% assign x_handle = settings.social-x-link | split: 'x.com/' | last | split: 'twitter.com/' | last %}
+ {%
+ render 'social-meta-tags',
+ twitter_handle: x_handle,
+ default_image: page_image,
+ %}
+
+ <!-- Theme CSS -->
+ <link rel="stylesheet" href="{{ 'theme.css' | asset_url }}">
+ {% render 'dw-product-styles' %}
+ <link rel="stylesheet" href="{{ 'custom.css' | asset_url }}">
+ {% if settings.custom-css != blank %}
+ <style>
+ {{ settings.custom-css }}
+ </style>
+ {% endif %}
+
+ <!-- Theme object -->
+ {% comment %}Inject theme-object begin{% endcomment %}
+ <script>
+ var Theme = {};
+ Theme.version = "7.1.0";
+ Theme.name = 'Grid';
+
+ Theme.currency = {{ shop.currency | json }};
+ Theme.moneyFormat = {{ shop.money_format | strip_html | json }};
+
+ Theme.pleaseSelectText = "{{ 'general.general.please_select' | t | strip_newlines | escape }}";
+
+ Theme.addToCartSuccess = "{{ 'products.product.success_html' | t: product: '**product**', cart_link: '**cart_link**', continue_link: '**continue_link**', checkout_link: '**checkout_link**' | strip_newlines | escape }}";
+
+ {% if shop.customer_accounts_enabled and customer %}
+ Theme.customerLoggedIn = true;
+ {% endif %}
+
+ Theme.shippingCalculator = true;
+ Theme.shippingButton = "{{ 'cart.shipping_calculator.submit' | t | strip_newlines | escape }}";
+ Theme.shippingDisabled = "{{ 'cart.shipping_calculator.disabled' | t | strip_newlines | escape }}";
+
+ {% if shop.customer_accounts_enabled and customer and customer.default_address %}
+ Theme.customerAddress = {{ customer.default_address | json }};
+ {% endif %}
+
+ Theme.shippingCalcErrorMessage = "{{ 'cart.shipping_calculator.error' | t | strip_newlines | replace: '"','\\"' }}";
+ Theme.shippingCalcMultiRates = "{{ 'cart.shipping_calculator.rates_html' | t | strip_newlines | replace: '"','\\"' }}";
+ Theme.shippingCalcOneRate = "{{ 'cart.shipping_calculator.rate' | t | strip_newlines | replace: '"','\\"' }}";
+ Theme.shippingCalcNoRates = "{{ 'cart.shipping_calculator.no_rates' | t | strip_newlines | replace: '"','\\"' }}";
+ Theme.shippingCalcRateValues = "{{ 'cart.shipping_calculator.rate_values_html' | t | strip_newlines | replace: '"','\\"' }}";
+
+ Theme.routes = {
+ "root_url": "{{ routes.root_url }}",
+ "account_url": "{{ routes.account_url }}",
+ "account_login_url": "{{ routes.account_login_url }}",
+ "account_logout_url": "{{ routes.account_logout_url }}",
+ "account_register_url": "{{ routes.account_register_url }}",
+ "account_addresses_url": "{{ routes.account_addresses_url }}",
+ "collections_url": "{{ routes.collections_url }}",
+ "all_products_collection_url": "{{ routes.all_products_collection_url }}",
+ "search_url": "{{ routes.search_url }}",
+ "cart_url": "{{ routes.cart_url }}",
+ "cart_add_url": "{{ routes.cart_add_url }}",
+ "cart_change_url": "{{ routes.cart_change_url }}",
+ "cart_clear_url": "{{ routes.cart_clear_url }}",
+ "product_recommendations_url": "{{ routes.product_recommendations_url }}",
+ "predictive_search_url": "{{ routes.predictive_search_url }}",
+ };
+ </script>
+ {% comment %}Inject theme-object end{% endcomment %}
+
+ {% render 'jquery-snippet' %}
+ <script src="{{ 'custom.js' | asset_url }}" defer></script>
+
+ <script>
+ (function() {
+ document.documentElement.classList.remove('no-js');
+ window.addEventListener('DOMContentLoaded', function() {
+ document.documentElement.classList.remove('loading');
+ });
+ window.setTimeout(function() {
+ document.documentElement.classList.remove('loading');
+ }, 2000);
+
+ if (!window.MutationObserver || !window.MutationObserver.prototype) {
+ return;
+ }
+ var originalObserve = window.MutationObserver.prototype.observe;
+ window.MutationObserver.prototype.observe = function(target, options) {
+ if (!(target instanceof Node)) {
+ return;
+ }
+ return originalObserve.call(this, target, options);
+ };
+ })();
+ </script>
+
+<script src="{{ 'dw-grid-control.js' | asset_url }}" defer></script>
+
+
+
+
+
+
+
+
+
+
+
+<!-- DW: Price hiding script REMOVED 2026-03-24 -->
+
+
+<!-- DW: killPrices REMOVED 2026-03-24 -->
+
+<!-- /DW -->
+
+{% if request.page_type == 'collection' %}
+<!-- DW: Grid Density Slider (3-12 columns, desktop only) — all collection pages -->
+<script>
+(function(){
+ const CFG = {
+ storageKey: 'dw_grid_cols',
+ minCols: 3,
+ maxCols: 12,
+ defaultCols: 3,
+ mobileBreakpoint: 768,
+ nameHideThreshold: 5 // Hide names when > 5 columns
+ };
+
+ const GRID_SEL = [
+ '[data-collection-grid]',
+ '.collection-grid',
+ '.product-grid',
+ '[role="region"] .grid',
+ 'main .grid',
+ '.grid'
+ ];
+
+ // Common product name selectors
+ const NAME_SEL = [
+ '.product-name',
+ '.card-title',
+ '.product-title',
+ 'h3',
+ 'h2',
+ '[data-product-name]',
+ '.title'
+ ];
+
+ function findGrid() {
+ for (const sel of GRID_SEL) {
+ const el = document.querySelector(sel);
+ if (el && el.children.length > 0) return el;
+ }
+ return null;
+ }
+
+ function findNameElements(grid) {
+ // Look for names within grid items
+ const names = [];
+ const items = grid.querySelectorAll(':scope > *');
+
+ for (const item of items) {
+ for (const sel of NAME_SEL) {
+ const name = item.querySelector(sel);
+ if (name && name.textContent.trim()) {
+ names.push(name);
+ break; // One name per item
+ }
+ }
+ }
+
+ return names;
+ }
+
+ function init() {
+ const grid = findGrid();
+ if (!grid || document.getElementById('dw-density-slider')) return;
+
+ const html = `
+ <div id="dw-density-slider" class="dw-grid-control">
+ <div class="dw-grid-label">Columns</div>
+ <div class="dw-grid-buttons">
+ <button data-cols="3" aria-label="3 columns" title="3" class="active">3</button>
+ <button data-cols="4" aria-label="4 columns" title="4">4</button>
+ <button data-cols="5" aria-label="5 columns" title="5">5</button>
+ <button data-cols="6" aria-label="6 columns" title="6">6</button>
+ </div>
+ <input type="range" id="dw-col-range" class="dw-slider" min="3" max="12" step="1" value="3" aria-label="Grid columns">
+ <span id="dw-col-label" class="dw-col-label">3 cols</span>
+ </div>
+ `;
+
+ const style = document.createElement('style');
+ style.textContent = `
+ #dw-density-slider {
+ display: none;
+ }
+
+ .dw-grid-label {
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: .08em;
+ text-transform: uppercase;
+ color: #666;
+ order: -1;
+ flex-basis: 100%;
+ }
+
+ .dw-grid-buttons {
+ display: none;
+ }
+
+ .dw-grid-buttons button {
+ flex: 1;
+ min-width: 36px;
+ height: 36px;
+ border: 1px solid #ddd;
+ background: #fff;
+ color: #666;
+ font-weight: 600;
+ font-size: 13px;
+ cursor: pointer;
+ border-radius: 4px;
+ transition: all .15s;
+ touch-action: manipulation;
+ }
+
+ .dw-grid-buttons button:active {
+ transform: scale(0.95);
+ }
+
+ .dw-grid-buttons button.active {
+ background: #000;
+ color: #fff;
+ border-color: #000;
+ }
+
+ .dw-slider {
+ display: none;
+ }
+
+ #dw-col-label {
+ display: none;
+ }
+
+ /* Smart name hiding: hide names when > 5 columns */
+ [data-grid-cols="6"] .product-name,
+ [data-grid-cols="6"] .card-title,
+ [data-grid-cols="6"] .product-title,
+ [data-grid-cols="6"] .title {
+ display: none !important;
+ }
+
+ @media (min-width: 769px) {
+ #dw-density-slider {
+ display: flex;
+ flex-wrap: nowrap;
+ gap: 16px;
+ background: transparent;
+ border: none;
+ padding: 12px 0;
+ margin: 24px 0;
+ width: auto;
+ min-width: fit-content;
+ flex-shrink: 0;
+ position: relative;
+ z-index: 10;
+ }
+
+ .dw-grid-label {
+ flex-basis: auto;
+ order: 0;
+ flex-shrink: 0;
+ }
+
+ .dw-grid-buttons {
+ display: none;
+ }
+
+ .dw-slider {
+ display: block;
+ flex: 0 0 200px;
+ height: 4px;
+ border-radius: 2px;
+ background: #ddd;
+ outline: none;
+ -webkit-appearance: none;
+ appearance: none;
+ cursor: pointer;
+ }
+
+ .dw-slider::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: #000;
+ cursor: pointer;
+ box-shadow: 0 1px 3px rgba(0,0,0,.2);
+ }
+
+ .dw-slider::-moz-range-thumb {
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: #000;
+ cursor: pointer;
+ border: 0;
+ box-shadow: 0 1px 3px rgba(0,0,0,.2);
+ }
+
+ .dw-slider::-moz-range-track {
+ background: transparent;
+ border: 0;
+ }
+
+ #dw-col-label {
+ display: block;
+ font-size: 12px;
+ color: #666;
+ min-width: 60px;
+ text-align: right;
+ }
+ }
+ `;
+ document.head.appendChild(style);
+
+ const div = document.createElement('div');
+ div.innerHTML = html;
+ grid.parentNode.insertBefore(div.firstElementChild, grid);
+
+ let cols = CFG.defaultCols;
+ try {
+ const saved = localStorage.getItem(CFG.storageKey);
+ if (saved) {
+ const n = parseInt(saved, 10);
+ if (n >= CFG.minCols && n <= CFG.maxCols) cols = n;
+ }
+ } catch (e) {}
+
+ const range = document.getElementById('dw-col-range');
+ const label = document.getElementById('dw-col-label');
+ const buttons = document.querySelectorAll('.dw-grid-buttons button');
+
+ function set(n) {
+ // Update grid columns
+ grid.style.gridTemplateColumns = `repeat(${n}, 1fr)`;
+ grid.setAttribute('data-grid-cols', n);
+
+ // Update label
+ label.textContent = `${n} col${n === 1 ? '' : 's'}`;
+
+ // Update slider
+ range.value = n;
+
+ // Update active button
+ buttons.forEach(btn => {
+ btn.classList.toggle('active', parseInt(btn.dataset.cols) === n);
+ });
+
+ // Smart name hiding: hide names if > 5 columns
+ const nameElements = findNameElements(grid);
+ nameElements.forEach(name => {
+ if (n > CFG.nameHideThreshold) {
+ name.style.display = 'none';
+ } else {
+ name.style.display = '';
+ }
+ });
+
+ // Save preference
+ try { localStorage.setItem(CFG.storageKey, String(n)); } catch (e) {}
+ }
+
+ // Event listeners
+ range.addEventListener('input', e => set(parseInt(e.target.value, 10)));
+ buttons.forEach(btn => {
+ btn.addEventListener('click', e => {
+ e.preventDefault();
+ set(parseInt(btn.dataset.cols, 10));
+ });
+ });
+
+ // Initial set
+ set(cols);
+ }
+
+ // Init on DOM ready
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', init);
+ } else {
+ init();
+ }
+
+ // Retry for slow-loading grids
+ setTimeout(() => {
+ if (!document.getElementById('dw-density-slider')) init();
+ }, 500);
+})();
+
+</script>
+<!-- /DW Grid Density Slider -->
+{% endif %}
+
+{% comment %} DW: ItemList structured data for the Shop-by-Brand page (script tags are stripped from page body_html, so injected here) {% endcomment %}
+{% if page.handle == 'brands' %}{% render 'brands-jsonld' %}{% endif %}
+
+<!-- cache-bust: 2026-03-25T00:54:55.724677 -->
+</head>
+
+<body
+ class="
+ template-{{ template.name }}
+ template-suffix-{{ template.suffix }}
+
+ {% if customer %}
+ customer-logged-in
+ {% endif %}
+ "
+>
+
+ {%- comment -%}
+ ── China Region Block (added 2026-02-27) ──
+ Blocks visitors from CN country code with a full-screen overlay.
+ {%- endcomment -%}
+ {%- if localization.country.iso_code == 'CN' -%}
+ <div id="region-block" style="position:fixed;inset:0;z-index:999999;background:#ffffff;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;padding:40px;font-family:-apple-system,BlinkMacSystemFont,sans-serif;">
+ <h1 style="font-size:24px;color:#333;margin-bottom:16px;">This store is not available in your region</h1>
+ <p style="font-size:16px;color:#666;max-width:500px;">We apologize for the inconvenience, but this store does not currently serve customers in your region.</p>
+ </div>
+ <style>body{overflow:hidden !important;}</style>
+ {%- endif -%}
+
+ {% sections 'header-group' %}
+
+ <div style="--background-color: {{ settings.background-color }}">
+ {%
+ render 'age-gate',
+ id: 'page',
+ sections: content_for_layout,
+ %}
+ </div>
+
+ {% include 'quickshop' %}
+
+ {% comment %}Inject icon-star-symbol begin{% endcomment %}
+ <svg
+ class="icon-star-reference"
+ aria-hidden="true"
+ focusable="false"
+ role="presentation"
+ xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="3 3 17 17" fill="none"
+ >
+ <symbol id="icon-star">
+ <rect class="icon-star-background" width="20" height="20" fill="currentColor"/>
+ <path d="M10 3L12.163 7.60778L17 8.35121L13.5 11.9359L14.326 17L10 14.6078L5.674 17L6.5 11.9359L3 8.35121L7.837 7.60778L10 3Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
+ </symbol>
+ <clipPath id="icon-star-clip">
+ <path d="M10 3L12.163 7.60778L17 8.35121L13.5 11.9359L14.326 17L10 14.6078L5.674 17L6.5 11.9359L3 8.35121L7.837 7.60778L10 3Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+ </clipPath>
+ </svg>
+ {% comment %}Inject icon-star-symbol end{% endcomment %}
+
+ <div class="main-content">
+ {% render "dw-boost-overrides" %}
+{{ content_for_layout }}
+ </div>
+
+ <div class="site-overlay" data-site-overlay></div>
+
+ {% sections 'footer-group' %}
+
+ <!-- Scripts -->
+ <!-- Third Party JS Libraries -->
+ <script src="{{ 'modernizr-2.8.2.min.js' | asset_url }}" defer></script>
+
+ {% if template contains 'cart' %}
+ <script src="{{ '/services/javascripts/countries.js' }}" defer></script>
+ <script src="{{ 'shopify_common.js' | shopify_asset_url }}" defer></script>
+ {% endif %}
+
+ {% if template contains 'customers' %}
+ <script src="{{ 'shopify_common.js' | shopify_asset_url }}" defer></script>
+ <script src="{{ 'customer_area.js' | shopify_asset_url }}" defer></script>
+ {% endif %}
+
+ <script src="{{ 'grid.js' | asset_url }}" defer></script>
+
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-article begin{% endcomment %}
+ {% comment %}
+ Article structured data
+ https://developers.google.com/search/docs/data-types/articles
+ {% endcomment %}
+
+ {% if template contains 'article' %}
+ {%- capture article_description -%}
+ {%- if article.excerpt != blank -%}
+ {{ article.excerpt | strip_html }}
+ {%- else -%}
+ {{ article.content | truncatewords: 100 | strip_html }}
+ {%- endif -%}
+ {%- endcapture -%}
+
+ <script type="application/ld+json">
+ {
+ "@context": "http://schema.org",
+ "@type": "BlogPosting",
+ "mainEntityOfPage": {
+ "@type": "WebPage",
+ "@id": "{{ shop.url }}{{ article.url }}"
+ },
+ "headline": {{ article.title | json }},
+ {% if article.image %}
+ "image": {
+ "@type": "ImageObject",
+ "url": {{ article.image | img_url: '800x800' | prepend: 'https:' | json }},
+ "height": 800,
+ "width": 800
+ },
+ {% endif %}
+ "datePublished": {{ article.published_at | date: '%Y-%m-%dT%H:%M:%S%z' | json}},
+ "dateModified": {{ article.published_at | date: '%Y-%m-%dT%H:%M:%S%z' | json}},
+ "author": {
+ "@type": "Person",
+ "name": {{ article.author | json }}
+ },
+ "publisher": {
+ "@type": "Organization",
+ "name": {{ shop.name | json }},
+ "logo": {
+ "@type": "ImageObject",
+ "url": {{ article.user.image | img_url: '200x200' | prepend: 'https:' | json }}
+ }
+ },
+ "description": {{ article_description | json }}
+ }
+ </script>
+ {% endif %}
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-article end{% endcomment %}
+
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-breadcrumbs begin{% endcomment %}
+ {% comment %}
+ Breadcrumbs
+ https://developers.google.com/search/docs/data-types/breadcrumbs
+ {% endcomment %}
+
+ {%- if current_tags -%}
+ {%- assign tag_names = current_tags | join: ', ' %}
+ {% comment %}Converting an array to a handle converts it to a string{% endcomment %}
+ {%- capture tag_handles -%}
+ {%- for tag in current_tags -%}
+ {{- tag | handle | append: '|' -}}
+ {%- endfor -%}
+ {%- endcapture -%}
+ {%- endif -%}
+
+ {% if collection.url == blank %}
+ {% assign collection_url = '/collections/all' %}
+ {% else %}
+ {% assign collection_url = collection.url %}
+ {% endif %}
+
+ {% if template.name == 'product'
+ or template.name == 'list-collections'
+ or template.name == 'collection'
+ or template.name == 'blog'
+ or template.name == 'article'
+ or template.name == 'search'
+ or template.name == 'cart'
+ or template.name == 'page'
+ %}
+
+ <script type="application/ld+json">
+ {
+ "@context": "http://schema.org",
+ "@type": "BreadcrumbList",
+ "itemListElement": [
+ {% case template.name %}
+ {% when 'product' %}
+ {% if product.collections.size >= 1 %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}/collections",
+ "name": {{ 'structured_data.breadcrumbs.collections' | t | json }}
+ }
+ },
+ {
+ "@type": "ListItem",
+ "position": 2,
+ "item": {
+ "@id": "{{ shop.url }}/collections/{{ product.collections.first.handle }}",
+ "name": {{ product.collections.first.title | json }}
+ }
+ },
+ {% else %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}/products",
+ "name": {{ 'structured_data.breadcrumbs.products' | t | json }}
+ }
+ },
+ {% endif %}
+ {
+ "@type": "ListItem",
+ "position": {% if product.collections.size >= 1 %}3{% else %}2{% endif %},
+ "item": {
+ "@id": "{{ shop.url }}{{ product.url | within: collection }}",
+ "name": {{ product.title | json }}
+ }
+ }
+ {% when 'list-collections' %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}/collections",
+ "name": {{ 'structured_data.breadcrumbs.collections' | t | json }}
+ }
+ }
+ {% if current_page != 1 %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": 2,
+ "item": {
+ "@id": "{{ shop.url }}/collections",
+ "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+ }
+ }
+ {% endif %}
+ {% when 'collection' %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}/collections",
+ "name": {{ 'structured_data.breadcrumbs.collections' | t | json }}
+ }
+ },
+ {
+ "@type": "ListItem",
+ "position": 2,
+ "item": {
+ "@id": "{{ shop.url }}{{ collection_url }}",
+ "name": {{ collection.title | json }}
+ }
+ }
+ {% if current_tags %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": 3,
+ "item": {
+ "@id": "{{ shop.url }}{{ collection_url }}/{{- tag_handles | split: '|' | join: '+' -}}",
+ "name": {{ 'structured_data.breadcrumbs.tags_html' | t: tags: tag_names | json }}
+ }
+ }
+ {% endif %}
+ {% if current_page != 1 %}
+ {% if current_tags %}
+ {% assign position = 4 %}
+ {% else %}
+ {% assign position = 3 %}
+ {% endif %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": {{ position }},
+ "item": {
+ "@id": "{{ shop.url }}/collections?page={{ current_page }}",
+ "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+ }
+ }
+ {% endif %}
+ {% when 'blog' or 'article' %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}{{ blog.url }}",
+ "name": {{ blog.title | json }}
+ }
+ }
+ {% if template.name == 'article' %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": 2,
+ "item": {
+ "@id": "{{ shop.url }}{{ article.url }}",
+ "name": {{ article.title | json }}
+ }
+ }
+ {% elsif current_tags %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": 2,
+ "item": {
+ "@id": "{{ shop.url }}{{ blog.url }}/tagged/{{- tag_handles | split: '|' | join: '+' -}}",
+ "name": {{ 'structured_data.breadcrumbs.tags_html' | t: tags: tag_names | json }}
+ }
+ }
+ {% endif %}
+ {% if current_page != 1 %}
+ {% if current_tags %}
+ {% assign position = 3 %}
+ {%- capture url -%}
+ {{ shop.url }}{{ blog.url }}/tagged/{{ tag_handles | split: '|' | join: '+' }}?page={{ current_page }}
+ {%- endcapture -%}
+ {% else %}
+ {% assign position = 2 %}
+ {%- capture url -%}
+ {{ shop.url }}{{ blog.url }}?page={{ current_page }}
+ {%- endcapture -%}
+ {% endif %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": {{ position }},
+ "item": {
+ "@id": "{{ url }}",
+ "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+ }
+ }
+ {% endif %}
+ {% when 'search' %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}/search",
+ "name": {{ 'structured_data.breadcrumbs.search' | t | json }}
+ }
+ }
+ {% if search.performed %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": 2,
+ "item": {
+ "@id": "{{ shop.url }}/search?q={{ search.terms }}",
+ "name": {{ search.terms | json }}
+ }
+ }
+ {% if current_page != 1 %}
+ ,
+ {
+ "@type": "ListItem",
+ "position": 3,
+ "item": {
+ "@id": "{{ shop.url }}/search?page={{ current_page }}&q={{ search.terms }}",
+ "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+ }
+ }
+ {% endif %}
+ {% endif %}
+ {% when 'cart' %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ shop.url }}/cart",
+ "name": {{ 'structured_data.breadcrumbs.cart' | t | json }}
+ }
+ }
+ {% when 'page' %}
+ {
+ "@type": "ListItem",
+ "position": 1,
+ "item": {
+ "@id": "{{ page.url }}",
+ "name": {{ page.title | json }}
+ }
+ }
+ {% else %}
+ {% endcase %}
+ ]
+ }
+ </script>
+ {% endif %}
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-breadcrumbs end{% endcomment %}
+
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-product begin{% endcomment %}
+ {% comment %}
+ Product structured data
+ https://developers.google.com/search/docs/data-types/products
+ {% endcomment %}
+
+ {% if template contains 'product' %}
+ {% assign selected_variant = product.selected_or_first_available_variant | default: product.variants.first %}
+ {% assign product_image = selected_variant.featured_image | default: product.featured_image %}
+ {%- capture product_name -%}
+ {{ product.title }}
+ {%- if selected_variant.title != 'Default Title' and selected_variant.option1 == 'Default Title' -%}
+ - {{ selected_variant.title }}
+ {%- endif -%}
+ {%- endcapture -%}
+
+ {%- assign now = 'now' | date: '%Y-%m-%d' | split: '-' -%}
+ {% capture year_from_now %}{{ now[0] | plus: 1 }}-{{ now[1] }}-{{ now[2] | at_most: 28 }}{% endcapture %}
+
+ <script type="application/ld+json">
+ {
+ "@context": "http://schema.org/",
+ "@type": "Product",
+ "name": {{ product_name | strip_newlines | json }},
+ "image": {{ product_image | img_url: '1024x1024' | prepend: 'https:' | json }},
+ {% if product.description != blank %}
+ "description": {{ product.description | json }},
+ {% endif %}
+ {% if product.vendor %}
+ "brand": {
+ "@type": "Thing",
+ "name": {{ product.vendor | json }}
+ },
+ {% endif %}
+ {% if selected_variant.sku != blank %}
+ "sku": {{ selected_variant.sku | json }},
+ {% endif %}
+ {% if selected_variant.barcode != blank %}
+ "mpn": {{ selected_variant.barcode | json }},
+ {% endif %}
+ "offers": {
+ "@type": "Offer",
+ "priceCurrency": {{ cart.currency.iso_code | json }},
+ "price": {{ selected_variant.price | divided_by: 100.0 | json }},
+ "availability": "http://schema.org/{% if selected_variant.available %}InStock{% else %}OutOfStock{% endif %}",
+ "url": "{{ shop.url }}{{ selected_variant.url }}",
+ "seller": {
+ "@type": "Organization",
+ "name": {{ shop.name | json }}
+ },
+ "priceValidUntil": {{ year_from_now | json }}
+ }
+ }
+ </script>
+ {% endif %}
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-product end{% endcomment %}
+
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-website begin{% endcomment %}
+ {% comment %}
+ Store information
+ https://developers.google.com/search/docs/data-types/sitename
+ {% endcomment %}
+
+ <script type="application/ld+json">
+ {
+ "@context": "http://schema.org",
+ "@type": "WebSite",
+ "name": "{{ shop.name }}",
+ "url": "{{ shop.url }}"
+ }
+ </script>
+ {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-website end{% endcomment %}
+
+ <form id="checkout_form" action="{{ routes.cart_url }}" method="POST" style="display: none;"></form>
+
+ <script>
+ (function () {
+ function handleFirstTab(e) {
+ if (e.keyCode === 9) { // the "I am a keyboard user" key
+ document.body.classList.add('user-is-tabbing');
+ window.removeEventListener('keydown', handleFirstTab);
+ }
+ }
+ window.addEventListener('keydown', handleFirstTab);
+ })();
+ </script>
+ <script>(function(n, v) {/* eslint-disable-next-line max-len */if (window.Shopify && window.Shopify.theme && navigator && navigator.sendBeacon && window.Shopify.designMode) {if (sessionStorage.getItem('oots_beacon')) return;navigator.sendBeacon('https://app.outofthesandbox.com/beacon', new URLSearchParams({shop_domain: window.Shopify.shop.toLowerCase(),shop_id: '{{ shop.id }}',shop_email: '{{ shop.email }}',theme_name: n.toLowerCase(),theme_version: v.toLowerCase(),theme_store_id: window.Shopify.theme.theme_store_id,theme_id: window.Shopify.theme.id,theme_role: window.Shopify.theme.role,}));sessionStorage.setItem('oots_beacon', '');}}('grid','7.1.0'))</script>
+
+<!--Start of Zendesk Chat Script-->
+<script async>
+window.$zopim||(function(d,s){var z=$zopim=function(c){z._.push(c)},$=z.s=
+d.createElement(s),e=d.getElementsByTagName(s)[0];z.set=function(o){z.set.
+_.push(o)};z._=[];z.set._=[];$.async=!0;$.setAttribute("charset","utf-8");
+$.src="https://v2.zopim.com/?RH5Yjru86SIJRwOxfiMAf2DTCgdROhhf";z.t=+new Date;$.
+type="text/javascript";e.parentNode.insertBefore($,e)})(document,"script");
+</script>
+<!--End of Zendesk Chat Script-->
+<!-- Statcounter code for DW - Started 3/5/19
+http://DesignerWallcoverings.com on Shopify -->
+<script type="text/javascript">
+var sc_project=11961678;
+var sc_invisible=1;
+var sc_security="9d9a53bd";
+var sc_https=1;
+</script>
+<script type="text/javascript"
+src="https://www.statcounter.com/counter/counter.js"
+async></script>
+<noscript><div class="statcounter"><a title="web statistics"
+href="https://statcounter.com/" target="_blank"><img
+class="statcounter"
+src="https://c.statcounter.com/11961678/0/9d9a53bd/1/"
+alt="web statistics"></a></div></noscript>
+<!-- End of Statcounter Code -->
+
+{% render 'hide-browse-hidden' %}
+
+<!-- DW: price restore band-aid removed 2026-06-11 — root cause (blank saw_variant_price) fixed in product-form-content.liquid; no price-hiding CSS exists. -->
+{%- comment -%} DW Shop-by-Color wheel {%- endcomment -%}
+<script>window.DW_CW_DATA="{{ 'dw-color-wheel-data.json' | asset_url }}";</script>
+<script src="{{ 'dw-color-wheel.js' | asset_url }}" defer></script>
+{%- comment -%} DW Phillip-Jeffries browse hide (stopgap) {%- endcomment -%}
+<script src="{{ 'dw-pj-hide.js' | asset_url }}" defer></script>
+{%- comment -%} DW card hover label: Pattern, Color + Vendor on hover (2026-06-22) {%- endcomment -%}
+<script src="{{ 'dw-card-hover.js' | asset_url }}" defer></script>
+{%- comment -%} DW horizontal collapsible Boost filter bar (2026-06-22) {%- endcomment -%}
+{%- if template contains 'collection' or template contains 'search' -%}
+ {{ 'dw-hfilter.css' | asset_url | stylesheet_tag }}
+ <script src="{{ 'dw-hfilter.js' | asset_url }}" defer></script>
+{%- endif -%}
+{%- comment -%} DW PDP restyle: size <select> -> pills + uniform CTA pill layout (2026-06-22) {%- endcomment -%}
+{{ 'dw-pdp-restyle.css' | asset_url | stylesheet_tag }}
+<script src="{{ 'dw-pdp-size-pills.js' | asset_url }}" defer></script>
+ <script src="{{ 'newwall-infinite.js' | asset_url }}" defer></script>
+</body>
+</html>
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_collection.liquid.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_collection.liquid.pushbak
new file mode 100644
index 00000000..609a8785
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_collection.liquid.pushbak
@@ -0,0 +1,262 @@
+<script
+ type="application/json"
+ data-section-id="{{ section.id }}"
+ data-section-type="static-collection"
+>
+</script>
+
+{% liquid
+ assign products_per_page = section.settings.products_per_row | times: section.settings.number_of_rows
+ assign use_masonry = false
+
+ if section.settings.layout == 'masonry'
+ assign use_masonry = true
+ endif
+
+ assign show_filters = false
+ if section.settings.show_filters
+ assign show_filters = true
+ endif
+
+ assign show_sorting = false
+ if section.settings.sorting
+ assign show_sorting = true
+ endif
+
+ assign show_collection_image = false
+ if collection.image and section.settings.show_collection_image
+ assign show_collection_image = true
+ endif
+%}
+
+{%- comment -%} DW collection hero (F1=B) {%- endcomment -%}
+{% render 'dw-collection-hero-bg' %}
+
+<div>
+ {% unless use_masonry %}
+ <h1 class="page-title">{{ collection.title }}</h1>
+ {% render 'breadcrumbs' %}
+ {% endunless %}
+
+ {% paginate collection.products by products_per_page %}
+ <section
+ class="collection collection-image--{{ show_collection_image }}"
+ data-product-hover="{{ settings.product_hover }}"
+ {% if use_masonry %}data-collection-masonry{% endif %}
+ data-section-id="{{ section.id }}"
+ data-section-type="collection">
+
+ {% if use_masonry or show_collection_image or collection.description != blank or show_sorting or show_filters %}
+ <div
+ class="
+ collection-header
+ {% if use_masonry %}
+ collection-header-alternate
+ {% endif %}
+ {% if show_filters and show_sorting %}
+ collection-header--filters-sort-enabled
+ {% endif %}
+ "
+ >
+ {% if show_collection_image %}
+ <div class="collection-featured-image">
+ {%
+ render 'rimg',
+ img: collection.image,
+ size: '1024x1024',
+ lazy: true,
+ %}
+ </div>
+ {% endif %}
+
+ <div class="collection-header-content">
+ {% if use_masonry %}
+ {% render 'breadcrumbs' %}
+ <h1 class="page-title">{{ collection.title }}</h1>
+ {% endif %}
+
+ {% if collection.description != blank and section.settings.show_description %}
+ <div class="collection-description rte">
+ {{ collection.description }}
+ </div>
+ {% endif %}
+
+ {% if show_filters or show_sorting %}
+ <div class="collection-filters">
+ {% if show_filters and collection.filters.size > 0 %}
+ <!-- Approach B: Horizontal filter bar (proxies to Boost's hidden controls) -->
+ {% render 'collection-filters-horizontal' %}
+
+ <!-- Boost native filters (hidden by Approach B CSS, powers the filtering) -->
+ <div class="faceted-filters" data-faceted-filter>
+ {%
+ render "faceted-filters",
+ filters: collection.filters,
+ class_prefix: 'collection',
+ %}
+ </div>
+ {% endif %}
+ {% if show_sorting %}
+ <div class="collection-sorting__wrapper">
+ <label class="collection-filters__title label" for="sort-by">
+ {{- 'collections.collection.sort_title' | t -}}:
+ </label>
+
+ <div
+ class="
+ collection-dropdown
+ collection-dropdown--sort
+ select-wrapper
+ {% if collection.current_vendor %}
+ vendor-collection
+ {% endif %}
+ "
+ >
+ {% assign current_sort = collection.sort_by | default: collection.default_sort_by %}
+
+ <span class="selected-text"></span>
+
+ <select id="sort-by" class="select" data-collection-sorting>
+ {%- for option in collection.sort_options -%}
+ {% if current_sort == option.value %}
+ <option value="{{ option.value }}" selected="selected">{{ option.name }}</option>
+ {% else %}
+ <option value="{{ option.value }}">{{ option.name }}</option>
+ {% endif %}
+ {% endfor %}
+ </select>
+ </div>
+ </div>
+ {% endif %}
+ </div>
+ {% endif %}
+ </div>
+
+ {% if show_filters and collection.filters.size > 0 %}
+ {% for filter in collection.filters %}
+ {% if filter.active_values.size > 0 or filter.min_value.value or filter.max_value.value %}
+ {%-
+ render 'faceted-filters-active',
+ show_sorting: show_sorting,
+ filter: filter,
+ filters: collection.filters,
+ class_prefix: 'collection',
+ clear_url: collection.url,
+ %}
+ {% break %}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+ </div>
+ {% endif %}
+
+ <!-- Full Collection Toolbar: Sort + Grid Density Slider -->
+ {% include 'collection-toolbar' %}
+
+ <div
+ class="collection-products rows-of-{{ section.settings.products_per_row }} grid-cols-3"
+ data-collection-grid
+ {% if use_masonry %}data-masonry-grid{% endif %}
+ >
+ {%- if use_masonry -%}
+ <div class="product-grid-masonry-sizer" data-masonry-sizer></div>
+ {%- endif -%}
+
+ {%- if collection.handle == 'all' and collection.all_vendors.size == 0 and collection.all_types.size == 0 -%}
+ {%- for i in (1..section.settings.products_per_row) -%}
+ {%- capture productImage -%}
+ {%- cycle 'product-1', 'product-2', 'product-3' -%}
+ {%- endcapture -%}
+ {%- assign image = productImage | placeholder_svg_tag: 'placeholder-svg' -%}
+
+ {%- render 'home-onboard-product', image: image -%}
+ {%- endfor -%}
+ {%- else -%}
+ {% for product in collection.products %}
+ {%
+ render 'product-list-item',
+ product: product,
+ %}
+ {% else %}
+ {% capture continueLink %}
+ <a href="{{ routes.all_products_collection_url }}">{{ 'collections.collection.continue_link' | t }}</a>
+ {% endcapture %}
+ <p class="empty">{{ 'collections.collection.empty_html' | t: continue_link: continueLink }}</p>
+ {% endfor %}
+ {%- endif -%}
+ </div>
+ </section>
+
+ {%
+ render 'pagination',
+ paginate: paginate,
+ %}
+ {% endpaginate %}
+</div>
+
+<script src="{{ 'collection-grid-density.js' | asset_url }}" defer></script>
+
+{% schema %}
+{
+ "name": "Collection pages",
+ "settings": [
+ {
+ "type": "checkbox",
+ "id": "show_collection_image",
+ "label": "Show collection image"
+ },
+ {
+ "type": "checkbox",
+ "id": "show_description",
+ "label": "Show description"
+ },
+ {
+ "type": "checkbox",
+ "id": "sorting",
+ "label": "Enable sorting",
+ "info": "Parameters include: best selling, A-Z, newest to oldest, etc."
+ },
+ {
+ "type": "checkbox",
+ "id": "show_filters",
+ "label": "Enable filtering",
+ "default": true
+ },
+ {
+ "type": "select",
+ "id": "layout",
+ "label": "Layout",
+ "options": [
+ {
+ "value": "default",
+ "label": "Default"
+ },
+ {
+ "value": "masonry",
+ "label": "Masonry"
+ }
+ ],
+ "default": "default"
+ },
+ {
+ "type": "range",
+ "id": "products_per_row",
+ "label": "Products per row",
+ "min": 2,
+ "max": 4,
+ "step": 1,
+ "default": 3
+ },
+ {
+ "type": "range",
+ "id": "number_of_rows",
+ "label": "Rows",
+ "min": 1,
+ "max": 12,
+ "step": 1,
+ "default": 3
+ }
+ ]
+}
+
+{% endschema %}
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_header.liquid.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_header.liquid.pushbak
new file mode 100644
index 00000000..5990c5d1
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/sections_header.liquid.pushbak
@@ -0,0 +1,483 @@
+<script
+ type="application/json"
+ data-section-type="static-header"
+ data-section-id="{{ section.id }}"
+ data-section-data
+>
+ {
+ "stickyHeader": {{ section.settings.sticky_header }},
+ "compactCenter": "{{ section.settings.header_layout }}",
+ "enable_predictive_search": "{{ section.settings.enable_predictive_search }}"
+ }
+</script>
+
+{%- capture arrow_right -%}
+ {%-
+ render 'icons',
+ id: 'chevron-right'
+ -%}
+{%- endcapture -%}
+
+{% assign mega_nav_handle = section.settings.mega-nav-handle %}
+
+{%- capture header_classes -%}
+ header
+ header-layout-{{ section.settings.header_layout }}
+
+ {% if section.settings.header_full_width %}
+ header-full-width
+ {% else %}
+ header-content-width
+ {% endif %}
+
+ {% if section.settings.sticky_header and section.settings.sticky_header_logo %}
+ header-sticky-show-logo
+ {% endif %}
+
+ {% if section.settings.header_border and template != 'index' %}
+ header-border
+ {% endif %}
+{%- endcapture -%}
+
+<section
+ class="{{ header_classes | replace: ' ', ' ' | strip_newlines }}"
+ {% if section.settings.sticky_header %}data-sticky-header{% endif %}
+ {% if section.settings.header_layout == 'compact-center' %}data-header-compact-center{% endif %}
+ data-section-header
+>
+ <header
+ class="main-header"
+ role="banner"
+ data-header-main
+ >
+ <div class="header-tools-wrapper">
+ <div class="header-tools">
+
+ <div class="aligned-left">
+ <div id="coin-container"></div>
+ </div>
+
+ <div class="aligned-left">
+ {% assign customer_link_blocks = section.blocks | where: 'type', 'header_customer_link' %}
+ {% for block in customer_link_blocks %}
+ <div class="customer-links" {{ block.shopify_attributes }}>
+ <a href="{{ block.settings.link_url }}">{{ block.settings.link_text }}</a>
+ </div>
+ {% endfor %}
+ </div>
+
+ <div class="aligned-right">
+ {% if shop.customer_accounts_enabled %}
+ <div class="customer-links">
+ {% if customer %}
+ <a href="{{ routes.account_url }}">{{ 'layout.header.my_account' | t }}</a>
+
+ <div class="customer-links-inner">
+ <span class="arrow"></span>
+ <ul>
+ <li><a href="{{ routes.account_url }}">{{ 'customers.general.purchases' | t }}</a></li>
+ <li><a href="{{ routes.account_addresses_url }}">{{ 'customers.addresses.header' | t }}</a></li>
+ <li>{{ 'layout.header.logout' | t | customer_logout_link }}</li>
+ </ul>
+ </div>
+ {% else %}
+ <a class="customer-login-link" href="{{ routes.account_login_url }}">{{ 'layout.header.account' | t }}</a>
+ {% endif %}
+ </div>
+ {% endif %}
+
+ <div class="mini-cart-wrapper">
+ <a class="cart-count" href="{{ routes.cart_url }}" data-cart-count>
+ <span class="cart-count-text">{{ 'layout.header.cart' | t }}</span>
+ (<span class="cart-count-number">{{ cart.item_count }}</span>)
+ </a>
+
+ {% render 'mini-cart' %}
+ </div>
+ <form class="checkout-link" action="{{ routes.cart_url }}" method="POST"><button class="checkout-link__button" type="submit" name="checkout">{{ 'layout.header.checkout' | t }}</button></form>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="header-main-content" data-header-content>
+ {% unless section.settings.menu == blank %}
+ <div class="header-content-left">
+ <button
+ class="navigation-toggle navigation-toggle-open"
+ aria-label="{{ 'layout.header.menu' | t }}"
+ data-header-nav-toggle
+ >
+ <span class="navigation-toggle-icon">
+ {%-
+ render 'icons',
+ id: 'menu'
+ -%}
+ </span>
+ </button>
+ </div>
+ {% endunless %}
+
+ <div
+ class="
+ header-branding
+ header-branding-desktop
+ {% if section.settings.logo %}header-branding-desktop--has-logo{% endif %}
+ "
+ data-header-branding
+ >
+ <a class="logo-link" href="{{ routes.root_url }}">
+ {%- if section.settings.logo -%}
+ {%
+ render 'rimg',
+ img: section.settings.logo,
+ class: 'logo-image',
+ size: '200x100',
+ focal_point: section.settings.logo.presentation.focal_point,
+ %}
+ {%- else -%}
+ <h1>{{- shop.name -}}</h1>
+ {%- endif -%}
+ </a>
+ <span
+ class="navigation-toggle navigation-toggle-close"
+ data-header-nav-toggle
+ >
+ {%-
+ render 'icons',
+ id: 'close',
+ -%}
+ </span>
+ </div>
+
+ {% unless section.settings.menu == blank %}
+ <div class="navigation-wrapper" data-navigation-wrapper>
+ <nav class="navigation navigation-desktop navigation-has-mega-nav" data-navigation-content>
+ <ul class="navigation-menu">
+ {% for link in linklists[section.settings.menu].links %}
+ {% assign first_tier_link = link %}
+ {% assign uses_blocks = true %}
+ {% comment %}Inject is-dropdown-or-meganav begin{% endcomment %}
+ {% comment %}
+ A helper snippet for detecting if a link has a mega nav
+ or dropdown associated with it.
+
+ @param first_tier_link
+
+ @param uses_blocks
+ {% endcomment %}
+
+ {% assign is_dropdown = false %}
+ {% assign is_meganav = true %}
+
+ {% if first_tier_link.links == blank %}
+ {% assign is_meganav = false %}
+ {% else %}
+ {% assign is_dropdown = true %}
+ {% endif %}
+
+ {% for second_tier_link in first_tier_link.links %}
+ {% if second_tier_link.links == blank %}
+ {% assign is_meganav = false %}
+ {% else %}
+ {% assign is_dropdown = true %}
+ {% endif %}
+ {% endfor %}
+
+ {% if is_meganav %}
+ {% assign is_dropdown = false %}
+ {% endif %}
+
+ {% if uses_blocks %}
+ {% assign found_mega_item_handle = false %}
+ {% if section != blank and section.blocks != blank %}
+ {% for block in section.blocks %}
+ {% if block.type == 'mega_menu' %}
+ {% assign menu_item_handle = block.settings.menu_item | handle %}
+ {% if first_tier_link.handle == menu_item_handle %}
+ {% assign found_mega_item_handle = true %}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+
+ {% if found_mega_item_handle %}
+ {% if is_dropdown %}
+ {% assign is_meganav = true %}
+ {% assign is_dropdown = false %}
+ {% endif %}
+ {% elsif found_mega_item_handle == false %}
+ {% if is_meganav %}
+ {% assign is_meganav = false %}
+ {% assign is_dropdown = true %}
+ {% endif %}
+ {% else %}
+ {% if is_meganav %}
+ {% assign is_meganav = false %}
+ {% assign is_dropdown = true %}
+ {% endif %}
+ {% endif %}
+ {% endif %}
+ {% comment %}Inject is-dropdown-or-meganav end{% endcomment %}
+
+
+ <li
+ class="{% if is_dropdown %}has-dropdown{% elsif is_meganav %}has-mega-nav{% endif %}"
+ {% if is_meganav %}data-mega-nav="true"{% endif %}
+ >
+ {% if is_dropdown or is_meganav %}
+ <details data-nav-details>
+ <summary data-href="{{ link.url }}"
+ {% else %}
+ <a href="{{ link.url }}"
+ {% endif %}
+ id="main-navigation-{{ link.handle }}"
+ class="navigation-menu-link"
+ {% if is_dropdown or is_meganav %}aria-haspopup{% endif %}
+ >
+ {{ link.title }}
+ {% if is_dropdown or is_meganav %}
+ <span
+ class="navigation-submenu-toggle"
+ tabIndex="0"
+ role="button"
+ aria-controls="navigation-{{ link.handle }}"
+ aria-expanded="false"
+ aria-label="{{ 'general.accessibility.toggle' | t }}"
+ data-subnav-toggle
+ >
+ {{- arrow_right -}}
+ </span>
+ {% endif %}
+ {% if is_dropdown or is_meganav %}
+ </summary>
+ {% else %}
+ </a>
+ {% endif %}
+
+ {% if is_dropdown %}
+ {% assign direction = 'right' %}
+ {% assign halfway = linklists[section.settings.menu].links.size | divided_by: 2 %}
+ {% if forloop.index0 > halfway %}
+ {% assign direction = 'left' %}
+ {% endif %}
+
+ {%- render 'dropdown', direction: direction, link: link -%}
+ </details>
+ {% elsif is_meganav %}
+ {%- render 'mega-nav', link: link -%}
+ {% endif %}
+ </li>
+ {% endfor %}
+
+ {% if shop.customer_accounts_enabled %}
+ {% if customer %}
+ <li class="mobile-link">
+ <a href="{{ routes.account_url }}">
+ {{ 'layout.header.my_account' | t }}
+ </a>
+ </li>
+ <li class="mobile-link">
+ {{ 'layout.header.logout' | t | customer_logout_link }}
+ </li>
+ {% else %}
+ <li class="mobile-link">
+ <a class="customer-login-link" href="{{ routes.account_login_url }}">{{ 'layout.header.account' | t }}</a>
+ </li>
+ {% endif %}
+ {% endif %}
+ </ul>
+ </nav>
+ {% render 'mobile-nav', arrow_right: arrow_right %}
+ </div>
+ {% endunless %}
+
+ <div class="header-content-right header-content-right--inline-search" data-header-content-right>
+ <div class="header-search-inline">
+ {%
+ render 'search-form',
+ context: 'header',
+ %}
+ <a href="#" class="visual-search-clickable header-search-inline__visual" aria-controls="Visual Search">
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" width="30px" height="30px" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 20 20"><path d="M10 8a3 3 0 1 0 0 6a3 3 0 0 0 0-6zm8-3h-2.4a.888.888 0 0 1-.789-.57l-.621-1.861A.89.89 0 0 0 13.4 2H6.6c-.33 0-.686.256-.789.568L5.189 4.43A.889.889 0 0 1 4.4 5H2C.9 5 0 5.9 0 7v9c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-8 11a5 5 0 0 1-5-5a5 5 0 1 1 10 0a5 5 0 0 1-5 5zm7.5-7.8a.7.7 0 1 1 0-1.4a.7.7 0 0 1 0 1.4z" fill="#000000"/></svg>
+ </a>
+ </div>
+
+ <button
+ class="search-toggle"
+ type="button"
+ aria-label="{{ 'general.search.header' | t }}"
+ data-header-search-toggle
+ >
+ {%
+ render 'icons',
+ id: 'search',
+ %}
+ </button>
+
+ {% if section.settings.sticky_header %}
+ <a class="sticky-header-cart-count" href="{{ routes.cart_url }}" data-cart-count>
+ <span class="cart-count-text">{{ 'layout.header.cart' | t }}</span>
+ (<span class="cart-count-number">{{ cart.item_count }}</span>)
+ </a>
+ {% endif %}
+ </div>
+
+ <div class="search-takeover" data-search-takeover>
+ <div class="search-takeover__wrapper">
+ {%
+ render 'search-form',
+ context: 'mobile',
+ %}
+
+ <button
+ class="search-takeover__close-button"
+ type="button"
+ aria-label="{{ 'general.search.close' | t }}"
+ data-search-takeover-close
+ >
+ {%
+ render 'icons',
+ id: 'close',
+ %}
+ </button>
+ </div>
+ </div>
+ </div>
+ </header>
+</section>
+
+{% schema %}
+{
+ "name": "Header",
+ "settings": [
+ {
+ "type": "header",
+ "content": "Logo"
+ },
+ {
+ "type": "image_picker",
+ "id": "logo",
+ "label": "Logo image",
+ "info": "200px tall recommended"
+ },
+ {
+ "type": "header",
+ "content": "Header"
+ },
+ {
+ "type": "select",
+ "id": "header_layout",
+ "label": "Logo layout",
+ "info": "Logo layouts are only active on screens wider than 1080px",
+ "options": [
+ {
+ "value": "default",
+ "label": "Default"
+ },
+ {
+ "value": "compact-center",
+ "label": "Compact center"
+ },
+ {
+ "value": "compact-left",
+ "label": "Compact left"
+ }
+ ],
+ "default": "compact-left"
+ },
+ {
+ "type": "checkbox",
+ "id": "header_full_width",
+ "label": "Enable full width header ",
+ "default": false
+ },
+ {
+ "type": "checkbox",
+ "id": "header_border",
+ "label": "Show header border",
+ "default": true,
+ "info": "This will appear on all pages except the home page."
+ },
+ {
+ "type": "checkbox",
+ "id": "sticky_header",
+ "label": "Enable sticky header"
+ },
+ {
+ "type": "checkbox",
+ "id": "sticky_header_logo",
+ "default": true,
+ "label": "Show logo image in sticky header"
+ },
+ {
+ "type": "header",
+ "content": "Search behavior"
+ },
+ {
+ "type": "checkbox",
+ "id": "enable_predictive_search",
+ "label": "Enable predictive search",
+ "default": true
+ },
+ {
+ "type": "header",
+ "content": "Navigation"
+ },
+ {
+ "type": "link_list",
+ "id": "menu",
+ "label": "Menu",
+ "default": "main-menu"
+ },
+ {
+ "type": "header",
+ "content": "Mini Cart"
+ },
+ {
+ "type": "checkbox",
+ "id": "enable_checkout_lock_icon",
+ "label": "Show lock icon on checkout button in mini cart",
+ "default": false
+ }
+ ],
+ "blocks": [
+ {
+ "type": "mega_menu",
+ "name": "Mega menu",
+ "settings": [
+ {
+ "type": "text",
+ "id": "menu_item",
+ "label": "Menu item",
+ "info": "Enter menu item to apply a mega menu dropdown. [Learn more](https://support.pixelunion.net/hc/en-us/articles/360022052534-How-to-set-up-your-store-s-navigation)"
+ },
+ {
+ "type": "image_picker",
+ "id": "menu_image",
+ "label": "Featured image",
+ "info": "480 x 1000px recommended"
+ }
+ ]
+ },
+ {
+ "type": "header_customer_link",
+ "name": "Header customer link",
+ "settings": [
+ {
+ "type": "text",
+ "id": "link_text",
+ "label": "Link text",
+ "default": "Contact us: (888) 373-4564"
+ },
+ {
+ "type": "url",
+ "id": "link_url",
+ "label": "Link URL"
+ }
+ ]
+ }
+ ]
+}
+
+{% endschema %}
\ No newline at end of file
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_collection-toolbar.liquid.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_collection-toolbar.liquid.pushbak
new file mode 100644
index 00000000..61a8b848
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_collection-toolbar.liquid.pushbak
@@ -0,0 +1,323 @@
+{%- comment -%}
+ Collection Toolbar — Horizontal sort + grid density slider + search
+ Replaces Shopify's native sorting/filtering UI with a unified toolbar.
+
+ Features:
+ - Sort dropdown (Newest, Color, Style, SKU, Title, Price)
+ - Grid density slider (3–12 columns)
+ - localStorage persistence
+ - Responsive mobile stacking
+
+ Revision: 2026-06-22
+{%- endcomment -%}
+
+<div class="collection-toolbar">
+ <style>
+ .collection-toolbar {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ padding: 20px 0;
+ border-bottom: 1px solid var(--border-color, rgba(0,0,0,0.1));
+ margin-bottom: 24px;
+ }
+
+ .toolbar-left {
+ display: flex;
+ gap: 14px;
+ align-items: center;
+ flex-wrap: nowrap;
+ min-width: 0;
+ }
+
+ .toolbar-label {
+ font-size: 11px;
+ letter-spacing: 0.22em;
+ text-transform: uppercase;
+ font-weight: 600;
+ color: var(--text-muted, rgba(0,0,0,0.6));
+ }
+
+ #collectionSort {
+ background: transparent;
+ border: 1px solid var(--border-color, rgba(0,0,0,0.12));
+ padding: 6px 10px;
+ font-family: inherit;
+ font-size: 12px;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ font-weight: 500;
+ color: var(--text-color, inherit);
+ cursor: pointer;
+ transition: all 0.2s ease;
+ min-width: 140px;
+ max-width: 100%;
+ overflow: visible;
+ }
+
+ #collectionSort:hover {
+ border-color: var(--accent-color, rgba(0,0,0,0.3));
+ }
+
+ #collectionSort:focus {
+ outline: 2px solid var(--accent-color, #000);
+ outline-offset: 2px;
+ }
+
+ .density-control {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 6px 0;
+ }
+
+ .density-control input[type="range"] {
+ flex: 0 0 120px;
+ -webkit-appearance: none;
+ appearance: none;
+ width: 120px;
+ height: 4px;
+ background: var(--border-color, rgba(0,0,0,0.15));
+ outline: none;
+ cursor: pointer;
+ border-radius: 2px;
+ }
+
+ .density-control input[type="range"]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ width: 13px;
+ height: 13px;
+ background: var(--accent-color, #000);
+ border-radius: 50%;
+ cursor: pointer;
+ transition: transform 0.2s ease;
+ }
+
+ .density-control input[type="range"]::-webkit-slider-thumb:hover {
+ transform: scale(1.2);
+ }
+
+ .density-control input[type="range"]::-moz-range-thumb {
+ width: 13px;
+ height: 13px;
+ background: var(--accent-color, #000);
+ border-radius: 50%;
+ border: 0;
+ cursor: pointer;
+ transition: transform 0.2s ease;
+ }
+
+ .density-control input[type="range"]::-moz-range-thumb:hover {
+ transform: scale(1.2);
+ }
+
+ .density-display {
+ font-size: 11px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ font-weight: 600;
+ color: var(--text-muted, rgba(0,0,0,0.6));
+ min-width: 60px;
+ text-align: right;
+ }
+
+ .toolbar-search {
+ flex: 0 1 200px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ border-bottom: 1px solid var(--border-color, rgba(0,0,0,0.1));
+ padding: 4px 0;
+ }
+
+ .toolbar-search input {
+ flex: 1;
+ background: transparent;
+ border: 0;
+ padding: 4px 0;
+ font-family: inherit;
+ font-size: 12px;
+ letter-spacing: 0.04em;
+ color: var(--text-color, inherit);
+ outline: none;
+ }
+
+ .toolbar-search input::placeholder {
+ color: var(--text-muted, rgba(0,0,0,0.4));
+ }
+
+ .toolbar-search svg {
+ width: 14px;
+ height: 14px;
+ stroke: var(--text-muted, rgba(0,0,0,0.4));
+ fill: none;
+ stroke-width: 1.5;
+ flex-shrink: 0;
+ }
+
+ /* Mobile responsive — hide density slider on mobile */
+ @media (max-width: 768px) {
+ .collection-toolbar {
+ gap: 12px;
+ }
+
+ .toolbar-left {
+ flex: 1 1 100%;
+ order: 1;
+ flex-wrap: wrap;
+ }
+
+ .toolbar-search {
+ flex: 1 1 100%;
+ order: 2;
+ margin-top: 8px;
+ }
+
+ .density-control {
+ display: none !important;
+ visibility: hidden !important;
+ width: 0 !important;
+ height: 0 !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ border: 0 !important;
+ }
+ }
+
+ /* Extra-small devices — ensure slider is completely hidden */
+ @media (max-width: 480px) {
+ .density-control {
+ display: none !important;
+ visibility: hidden !important;
+ pointer-events: none !important;
+ }
+ }
+ </style>
+
+ <div class="toolbar-left">
+ <label for="collectionSort" class="toolbar-label">Sort</label>
+ <select id="collectionSort" aria-label="Sort products">
+ <option value="newest">Newest</option>
+ <option value="color">Color</option>
+ <option value="style">Style</option>
+ <option value="sku">SKU A→Z</option>
+ <option value="title">Title A→Z</option>
+ <option value="price-asc">Price ↑</option>
+ <option value="price-desc">Price ↓</option>
+ </select>
+
+ <div class="density-control">
+ <span class="toolbar-label">Grid</span>
+ <input type="range" id="densitySlider" min="3" max="12" value="4" aria-label="Grid density">
+ <div class="density-display"><span id="densityLabel">4</span> col</div>
+ </div>
+ </div>
+
+ {% if section.settings.show_search %}
+ <div class="toolbar-search">
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
+ <circle cx="11" cy="11" r="8"></circle>
+ <path d="m21 21-4.35-4.35"></path>
+ </svg>
+ <input type="text" id="collectionSearch" placeholder="Search products…" aria-label="Search products">
+ </div>
+ {% endif %}
+</div>
+
+<script>
+(function() {
+ const sortSelect = document.getElementById('collectionSort');
+ const densitySlider = document.getElementById('densitySlider');
+ const densityLabel = document.getElementById('densityLabel');
+ const searchInput = document.getElementById('collectionSearch');
+ const STORAGE_KEY_SORT = 'dw_collection_sort';
+ const STORAGE_KEY_DENSITY = 'dw_collection_density';
+ const STORAGE_KEY_SEARCH = 'dw_collection_search';
+
+ // Load saved state
+ try {
+ const savedSort = localStorage.getItem(STORAGE_KEY_SORT);
+ if (savedSort) sortSelect.value = savedSort;
+
+ const savedDensity = localStorage.getItem(STORAGE_KEY_DENSITY);
+ if (savedDensity) {
+ densitySlider.value = savedDensity;
+ densityLabel.textContent = savedDensity;
+ updateGridDensity(parseInt(savedDensity));
+ }
+
+ const savedSearch = localStorage.getItem(STORAGE_KEY_SEARCH);
+ if (savedSearch) searchInput.value = savedSearch;
+ } catch (e) {}
+
+ // Sort change
+ sortSelect.addEventListener('change', function() {
+ try { localStorage.setItem(STORAGE_KEY_SORT, this.value); } catch (e) {}
+ applySort(this.value);
+ });
+
+ // Density slider
+ densitySlider.addEventListener('input', function() {
+ const cols = parseInt(this.value);
+ densityLabel.textContent = cols;
+ try { localStorage.setItem(STORAGE_KEY_DENSITY, cols); } catch (e) {}
+ updateGridDensity(cols);
+ });
+
+ // Search
+ searchInput.addEventListener('input', debounce(function() {
+ try { localStorage.setItem(STORAGE_KEY_SEARCH, this.value); } catch (e) {}
+ applySearch(this.value);
+ }, 300));
+
+ function updateGridDensity(cols) {
+ const productGrid = document.querySelector('.collection-products') || document.querySelector('[data-collection-grid]') || document.querySelector('[role="list"]') || document.querySelector('[data-product-grid]');
+ if (productGrid) {
+ productGrid.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;
+ productGrid.setAttribute('data-cols', cols);
+ }
+ }
+
+ function applySort(mode) {
+ const url = new URL(window.location);
+ if (mode === 'newest') {
+ url.searchParams.delete('sort_by');
+ } else {
+ // Map DW sort modes to Shopify's sort_by values
+ const sortMap = {
+ 'title': 'title-ascending',
+ 'price-asc': 'price-ascending',
+ 'price-desc': 'price-descending'
+ };
+ url.searchParams.set('sort_by', sortMap[mode] || mode);
+ }
+ window.location.href = url.toString();
+ }
+
+ function applySearch(query) {
+ if (query.trim() === '') {
+ window.location.href = window.location.pathname;
+ } else {
+ const url = new URL(window.location);
+ url.searchParams.set('q', query);
+ window.location.href = url.toString();
+ }
+ }
+
+ function debounce(fn, delay) {
+ let timer;
+ return function(...args) {
+ clearTimeout(timer);
+ timer = setTimeout(() => fn.apply(this, args), delay);
+ };
+ }
+
+ // Initialize grid on page load
+ window.addEventListener('load', function() {
+ updateGridDensity(parseInt(densitySlider.value));
+ });
+})();
+</script>
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_dw-collection-hero-bg.liquid.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_dw-collection-hero-bg.liquid.pushbak
new file mode 100644
index 00000000..cc97ebd2
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_dw-collection-hero-bg.liquid.pushbak
@@ -0,0 +1,128 @@
+{%- comment -%}
+ DW collection hero — ROTATING new-arrivals slideshow (F1=B evolution).
+ Owner: vp-dw-commerce · 2026-06-23 · DTD: source=A (theme-native new-arrivals),
+ curation=C (hybrid: curated collection.image is frame 1, then newest store-wide).
+
+ Behaviour (priority + composition):
+ FRAME 1 (curated floor, if present, in priority order):
+ 1. collection.image (per-collection hero — Steve's HARD rule)
+ 2. settings.collection_default_hero (one branded customizer fallback)
+ FRAMES 2..N (dynamic): the featured images of the newest store-wide active
+ SKUs, read live from collections['new-arrivals'].products. This self-updates
+ as the 18/hr cadence publishes new SKUs into new-arrivals — zero backend.
+ If NEITHER a curated image NOR any new-arrivals image exists -> no slides;
+ the polished imageless band + clean dark type kicks in (dw-collection-hero.css).
+
+ Customizer:
+ settings.collection_hero_rotate (checkbox, default true) — turn the rotation
+ on/off store-wide. When OFF and a curated image exists, only frame 1 shows
+ (Codex's "curated always wins" dissent path). When OFF and no curated image,
+ the single newest new-arrival image shows (still never the grey dead-state).
+
+ Sets html.dw-coll-hero + body.dw-collection-has-hero when ≥1 slide exists, so
+ the CSS switches the title to the white-on-image pill and never strips the band.
+ Targets BOTH the Boost header (live grid) and the theme pre-hydration header.
+ The crossfade is driven by assets/dw-hero-rotator.js (prefers-reduced-motion
+ aware: holds on frame 1 for those users). No layout shift — slides are absolutely
+ positioned inside the fixed-height header band.
+ Remove: delete the render call + this file + assets/dw-hero-rotator.js.
+{%- endcomment -%}
+
+{%- liquid
+ assign rotate_on = true
+ if settings.collection_hero_rotate == false
+ assign rotate_on = false
+ endif
+
+ assign curated_url = ''
+ if collection.image
+ assign curated_url = collection.image | image_url: width: 2000
+ elsif settings.collection_default_hero
+ assign curated_url = settings.collection_default_hero | image_url: width: 2000
+ endif
+
+ assign na = collections['new-arrivals']
+-%}
+
+{%- comment -%} Build the ordered, de-duplicated slide list (max 8). {%- endcomment -%}
+{%- capture dw_hero_slides -%}
+ {%- assign seen = '' -%}
+ {%- if curated_url != blank -%}
+ {{ curated_url }}|||{%- assign seen = curated_url | append: '~' | append: seen -%}
+ {%- endif -%}
+ {%- if rotate_on and na != blank -%}
+ {%- assign count = 0 -%}
+ {%- for p in na.products limit: 16 -%}
+ {%- if p.featured_image -%}
+ {%- assign slide = p.featured_image | image_url: width: 2000 -%}
+ {%- unless seen contains slide -%}
+ {{ slide }}|||{%- assign seen = slide | append: '~' | append: seen -%}{%- assign count = count | plus: 1 -%}
+ {%- endunless -%}
+ {%- endif -%}
+ {%- if count >= 8 -%}{%- break -%}{%- endif -%}
+ {%- endfor -%}
+ {%- endif -%}
+{%- endcapture -%}
+{%- assign dw_hero_slides = dw_hero_slides | strip -%}
+{%- assign slide_list = dw_hero_slides | split: '|||' -%}
+
+{%- if dw_hero_slides != blank -%}
+<script>
+ document.documentElement.classList.add('dw-coll-hero');
+ document.addEventListener('DOMContentLoaded', function () {
+ document.body && document.body.classList.add('dw-collection-has-hero');
+ });
+</script>
+<div class="dw-hero-rotator" aria-hidden="true" data-dw-hero-rotator data-interval="5200">
+ {%- assign idx = 0 -%}
+ {%- for url in slide_list -%}
+ {%- assign u = url | strip -%}
+ {%- if u != blank -%}
+ <div class="dw-hero-slide{% if idx == 0 %} is-active{% endif %}"
+ data-dw-slide="{{ idx }}"
+ style="background-image: linear-gradient(180deg, rgba(0,0,0,0.18), rgba(0,0,0,0.34)), url('{{ u }}');"></div>
+ {%- assign idx = idx | plus: 1 -%}
+ {%- endif -%}
+ {%- endfor -%}
+</div>
+<script src="{{ 'dw-hero-rotator.js' | asset_url }}" defer></script>
+<style>
+ /* Paint the rotator INTO the live Boost header band (and the theme header
+ pre-hydration). The .dw-hero-rotator is rendered just above the header in
+ collection.liquid; CSS pins it to fill the header band behind the title. */
+ .dw-coll-hero .boost-sd__collection-header,
+ .dw-coll-hero .template-collection .collection-header,
+ html.dw-coll-hero .template-collection .collection-header {
+ position: relative;
+ min-height: 240px;
+ display: flex; align-items: center; justify-content: center; text-align: center;
+ background-color: #1a1a1a !important; /* base under the slides while images decode */
+ overflow: hidden;
+ }
+ /* Boost paints opaque inner wrappers (boost-sd__header-main-2 + --middle,
+ bg rgb(246,246,248) / rgb(244,242,238)) that would cover the rotator
+ slides. Make them transparent so the rotating imagery shows through, and
+ lift their content above the slides. */
+ .dw-coll-hero .boost-sd__collection-header .boost-sd__header-main-2,
+ .dw-coll-hero .boost-sd__collection-header .boost-sd__header-main-2--middle,
+ .dw-coll-hero .boost-sd__collection-header .boost-sd__header-main-2-content,
+ .dw-coll-hero .boost-sd__collection-header .boost-sd__header-inner {
+ background: transparent !important;
+ position: relative;
+ z-index: 2;
+ }
+ /* image present -> white pill title (high specificity to win over neutralizer) */
+ body.dw-collection-has-hero .boost-sd__collection-header .boost-sd__header-title,
+ .dw-coll-hero .template-collection .collection-header .page-title {
+ color: #fff !important;
+ background: rgba(0,0,0,0.42) !important;
+ border-radius: 4px !important;
+ padding: 12px 28px !important;
+ display: inline-block !important;
+ text-shadow: 0 1px 18px rgba(0,0,0,0.45);
+ position: relative; z-index: 3;
+ }
+ body.dw-collection-has-hero .boost-sd__collection-header .boost-sd__header-description,
+ body.dw-collection-has-hero .boost-sd__collection-header .boost-sd__header-description * { color: rgba(255,255,255,.92) !important; }
+</style>
+{%- endif -%}
diff --git a/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_product-list-item.liquid.pushbak b/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_product-list-item.liquid.pushbak
new file mode 100644
index 00000000..d1a115fd
--- /dev/null
+++ b/shopify/collection-hero-fix/backups/live-push-20260623-163312/snippets_product-list-item.liquid.pushbak
@@ -0,0 +1,174 @@
+{% comment %}
+ @param product_attributes
+ custom attributes to be applied to the product item
+ Defaults to: blank
+{% endcomment %}
+
+{% liquid
+ assign product_attributes = product_attributes | default: ''
+ assign product_hover = settings.product_hover | default: 'quick-shop'
+ assign product_stock_level_threshold = settings.product_stock_level_threshold | default: 1
+ assign product_badges = settings.product_badges | default: false
+ assign product_icons = settings.product_badges_icons | default: false
+ assign product_vendor = settings.show_vendor | default: false
+
+ assign item = product
+ if template contains 'search'
+ assign item = item
+ endif
+
+ assign has_quick_shop = false
+ if product_hover == 'quick-shop' and template.name != 'password' and product.variants_count <= 250
+ assign has_quick_shop = true
+ endif
+%}
+
+{% if product_hover == 'stock-level' and item.available %}
+ {% assign total = 0 %}
+ {% assign threshold = product_stock_level_threshold | times: 1 %}
+ {% assign infinity = false %}
+ {% for variant in item.variants %}
+ {% if variant.inventory_management == null %}
+ {% assign infinity = true %}
+ {% elsif variant.inventory_management == '' %}
+ {% assign infinity = true %}
+ {% elsif variant.inventory_management == 'shopify' and variant.inventory_policy == 'continue' %}
+ {% assign infinity = true %}
+ {% elsif infinity == false %}
+ {% capture temp %}{{ total | plus: variant.inventory_quantity }}{% endcapture %}
+ {% assign total = temp | times: 1 %}
+ {% endif %}
+ {% endfor %}
+ {% assign stockText = 'products.product.stock_indicator_message' | t: num: total %}
+{% endif %}
+
+<article
+ class="
+ product-list-item
+ {% if has_quick_shop %} has-quick-shop{% endif %}
+ {% if item.available and infinity == false and total <= threshold %} has-stock-indicator{%endif %}
+ "
+ id="product-list-item-{{ item.id }}"
+ data-product-id="{{ item.id }}"
+ {{ product_attributes }}
+>
+
+ {% assign secondaryImage = false %}
+ {% if item.media.size > 1 and product_hover == 'image-flip' %}
+ {% assign secondaryImage = true %}
+ {% endif %}
+
+ <figure
+ class="
+ product-list-item-thumbnail
+ {% if secondaryImage %}
+ has-secondary-image
+ {% endif %}
+ "
+ data-url="{{ item.url | within: collection }}"
+ {% if secondaryImage %}
+ {%
+ render 'rimg',
+ img: item.media[1].preview_image,
+ alt: item.media[1].preview_image.alt,
+ size: '600x600',
+ background: true,
+ lazy: true
+ %}
+ {% endif %}
+ >
+ <a href="{{ item.url | within: collection }}" aria-label="{{ item.title }}">
+ {% if item.featured_media.preview_image %}
+ {%
+ render 'rimg',
+ img: item.featured_media.preview_image,
+ alt: item.featured_media.preview_image.alt,
+ size: '600x600',
+ lazy: true
+ %}
+ {% else %}
+ {{ 'product-1' | placeholder_svg_tag: 'placeholder-svg' }}
+ {% endif %}
+ </a>
+
+ {% if has_quick_shop %}
+ <span
+ class="quick-shop-modal-trigger"
+ data-product-url="{{ item.url | within: collection }}"
+ >
+ {{ 'products.product.quick_shop_trigger_text' | t }}
+ </span>
+ {% elsif product_hover == 'stock-level' %}
+
+ {% if item.available and infinity == false and total <= threshold %}
+ <a class="product-list-item-inventory" href="{{ item.url }}">{{ stockText }}</a>
+ {% endif %}
+
+ {% endif %}
+
+ {% if product_badges %}
+ {% if item.available != true %}
+ <span class="product-list-item-unavailable{% if product_icons %} product-icons{% endif %}" data-title="{{ 'products.product.sold_out' | t }}"></span>
+ {% elsif item.compare_at_price_min > item.price_min %}
+ <span class="product-list-item-on-sale{% if product_icons %} product-icons{% endif %}" data-title="{{ 'products.product.on_sale' | t }}"></span>
+ {% endif %}
+ {% endif %}
+
+ <!-- Hover overlay: vendor + pattern name only -->
+ <div class="product-list-item-hover-overlay">
+ <div class="product-list-item-hover-content">
+ <p class="product-list-item-hover-vendor">{{ item.vendor }}</p>
+ <h3 class="product-list-item-hover-title">{{ item.title }}</h3>
+ </div>
+ </div>
+ </figure>
+
+ <div class="product-list-item-details" style="display:none;"></div>
+ {% assign variant_for_unit_price = item.variants | sort: 'price' | first %}
+ {% if variant_for_unit_price.unit_price %}
+ {% comment %}Inject unit-price begin{% endcomment %}
+ {% comment %}
+ @param variant_for_unit_price
+ Product variant for price
+ @param tax_text
+ String containing 'tax included' text
+ {% endcomment %}
+
+ {% capture total_quantity %}
+ <span class="product-price__unit-price-total-quantity" data-unit-price-quantity>
+ {{ variant_for_unit_price.unit_price_measurement.quantity_value }}{{ variant_for_unit_price.unit_price_measurement.quantity_unit }}
+ </span>
+ {% endcapture %}
+
+
+ {% capture unit_price %}
+ <span class="product-price__unit-price-amount money" data-unit-price-amount>
+ {{ variant_for_unit_price.unit_price | money }}
+ </span>
+ {% endcapture %}
+ {% capture unit_measure %}
+ <span class="product-price__unit-price-measure" data-unit-price-measure>
+ {%- if variant_for_unit_price.unit_price_measurement.reference_value != 1 -%}
+ {{ variant_for_unit_price.unit_price_measurement.reference_value }}
+ {%- endif %}
+ {{ variant_for_unit_price.unit_price_measurement.reference_unit }}
+ </span>
+ {% endcapture %}
+
+ <div
+ class="
+ product-price__unit-price
+ {% unless variant_for_unit_price.unit_price_measurement %}hidden{% endunless %}
+ "
+ data-unit-price
+ >
+ {{ 'products.product.price_per_unit_html' | t: total_quantity: total_quantity, unit_price: unit_price, unit_measure: unit_measure | strip_newlines }}
+ </div>
+
+ {% assign variant_for_unit_price = blank %}
+ {% comment %}Inject unit-price end{% endcomment %}
+
+ {% endif %}
+ </div>
+
+</article>
\ No newline at end of file
← 008e67ab Serve DW style guide standalone via pm2 (dw-style-guide, :99
·
back to Designer Wallcoverings
·
Close 5 collection-page memos + reconciliation (pushed live, 04639652 →